/ Hex Artifact Content
Login

Artifact a83f4cb85e4d3b98c1659a799f9e318fcaf1c76c:


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 66 69 6c 65 20 63 6f 6e 74  * This file cont
0190: 61 69 6e 73 20 63 6f 64 65 20 74 68 61 74 20 69  ains code that i
01a0: 73 20 73 70 65 63 69 66 69 63 20 74 6f 20 70 61  s specific to pa
01b0: 72 74 69 63 75 6c 61 72 20 6f 70 65 72 61 74 69  rticular operati
01c0: 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 20 20  ng.** systems.  
01d0: 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74  The purpose of t
01e0: 68 69 73 20 66 69 6c 65 20 69 73 20 74 6f 20 70  his file is to p
01f0: 72 6f 76 69 64 65 20 61 20 75 6e 69 66 6f 72 6d  rovide a uniform
0200: 20 61 62 73 74 72 61 63 74 0a 2a 2a 20 6f 6e 20   abstract.** on 
0210: 77 68 69 63 68 20 74 68 65 20 72 65 73 74 20 6f  which the rest o
0220: 66 20 53 51 4c 69 74 65 20 63 61 6e 20 6f 70 65  f SQLite can ope
0230: 72 61 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  rate..*/.#includ
0240: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0250: 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a  #include "os.h".
0260: 0a 23 69 66 6e 64 65 66 20 4f 53 5f 55 4e 49 58  .#ifndef OS_UNIX
0270: 0a 23 20 69 66 6e 64 65 66 20 4f 53 5f 57 49 4e  .# ifndef OS_WIN
0280: 0a 23 20 20 64 65 66 69 6e 65 20 4f 53 5f 55 4e  .#  define OS_UN
0290: 49 58 20 31 0a 23 20 65 6c 73 65 0a 23 20 20 64  IX 1.# else.#  d
02a0: 65 66 69 6e 65 20 4f 53 5f 55 4e 49 58 20 30 0a  efine OS_UNIX 0.
02b0: 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23  # endif.#endif.#
02c0: 69 66 6e 64 65 66 20 4f 53 5f 57 49 4e 0a 23 20  ifndef OS_WIN.# 
02d0: 64 65 66 69 6e 65 20 4f 53 5f 57 49 4e 20 30 0a  define OS_WIN 0.
02e0: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 55 4e  #endif.#if OS_UN
02f0: 49 58 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 6e  IX.# include <un
0300: 69 73 74 64 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  istd.h>.# includ
0310: 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 20 69 6e  e <fcntl.h>.# in
0320: 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e  clude <sys/stat.
0330: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 74 69  h>.# include <ti
0340: 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  me.h>.#endif.#if
0350: 20 4f 53 5f 57 49 4e 0a 23 20 69 6e 63 6c 75 64   OS_WIN.# includ
0360: 65 20 3c 77 69 6e 62 61 73 65 2e 68 3e 0a 23 65  e <winbase.h>.#e
0370: 6e 64 69 66 0a 0a 0a 23 69 66 20 4f 53 5f 55 4e  ndif...#if OS_UN
0380: 49 58 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 69 73  IX./*.** Here is
0390: 20 74 68 65 20 64 69 72 74 20 6f 6e 20 50 4f 53   the dirt on POS
03a0: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
03b0: 73 3a 20 20 41 4e 53 49 20 53 54 44 20 31 30 30  s:  ANSI STD 100
03c0: 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65  3.1 (1996).** se
03d0: 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69  ction 6.5.2.2 li
03e0: 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68 20  nes 483 through 
03f0: 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61 74  490 specify that
0400: 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a   when a process.
0410: 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72  ** sets or clear
0420: 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f  s a lock, that o
0430: 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64  peration overrid
0440: 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63  es any prior loc
0450: 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65  ks set.** by the
0460: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20   same process.  
0470: 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c  It does not expl
0480: 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62  icitly say so, b
0490: 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a  ut this implies.
04a0: 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72 72  ** that it overr
04b0: 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62  ides locks set b
04c0: 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
04d0: 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66 65  ss using a diffe
04e0: 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73  rent.** file des
04f0: 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64  criptor.  Consid
0500: 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61 73  er this test cas
0510: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69  e:.**.**       i
0520: 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e  nt fd1 = open(".
0530: 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c  /file1", O_RDWR|
0540: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
0550: 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 32  **       int fd2
0560: 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32   = open("./file2
0570: 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  ", O_RDWR|O_CREA
0580: 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20  T, 0644);.**.** 
0590: 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20  Suppose ./file1 
05a0: 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20  and ./file2 are 
05b0: 72 65 61 6c 6c 79 20 62 65 20 74 68 65 20 73 61  really be the sa
05c0: 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65  me file (because
05d0: 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72  .** one is a har
05e0: 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69  d or symbolic li
05f0: 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29  nk to the other)
0600: 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74   then if you set
0610: 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65  .** an exclusive
0620: 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68   lock on fd1, th
0630: 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e  en try to get an
0640: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a   exclusive lock.
0650: 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f  ** on fd2, it wo
0660: 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61  rks.  I would ha
0670: 76 65 20 65 78 70 65 63 74 65 64 20 74 68 65 20  ve expected the 
0680: 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a  second lock to.*
0690: 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65  * fail since the
06a0: 72 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 61  re was already a
06b0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
06c0: 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a  e due to fd1..**
06d0: 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69   But not so.  Si
06e0: 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63  nce both locks c
06f0: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d  ame from the sam
0700: 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a  e process, the.*
0710: 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64  * second overrid
0720: 65 73 20 74 68 65 20 66 69 72 73 74 2c 20 65 76  es the first, ev
0730: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77  en though they w
0740: 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ere on different
0750: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
0760: 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64  tors opened on d
0770: 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61  ifferent file na
0780: 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 42 75 6d 6d 65  mes..**.** Bumme
0790: 72 2e 20 20 49 66 20 79 6f 75 20 61 73 6b 20 6d  r.  If you ask m
07a0: 65 2c 20 74 68 69 73 20 69 73 20 62 72 6f 6b 65  e, this is broke
07b0: 6e 2e 20 20 42 61 64 6c 79 20 62 72 6f 6b 65 6e  n.  Badly broken
07c0: 2e 20 20 49 74 20 6d 65 61 6e 73 0a 2a 2a 20 74  .  It means.** t
07d0: 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73  hat we cannot us
07e0: 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f  e POSIX locks to
07f0: 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c   synchronize fil
0800: 65 20 61 63 63 65 73 73 20 61 6d 6f 6e 67 0a 2a  e access among.*
0810: 2a 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65  * competing thre
0820: 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ads of the same 
0830: 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20  process.  POSIX 
0840: 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20  locks will work 
0850: 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68  fine.** to synch
0860: 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f  ronize access fo
0870: 72 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70  r threads in sep
0880: 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c  arate processes,
0890: 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65   but not.** thre
08a0: 61 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  ads within the s
08b0: 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  ame process..**.
08c0: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
08d0: 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53  d the problem, S
08e0: 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e  QLite has to man
08f0: 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69  age file locks i
0900: 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20  nternally.** on 
0910: 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76  its own.  Whenev
0920: 65 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  er a new databas
0930: 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20  e is opened, we 
0940: 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65  have to find the
0950: 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f  .** specific ino
0960: 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  de of the databa
0970: 73 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f  se file (the ino
0980: 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  de is determined
0990: 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65   by the.** st_de
09a0: 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65  v and st_ino fie
09b0: 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20  lds of the stat 
09c0: 73 74 72 75 63 74 75 72 65 20 74 68 65 20 73 74  structure the st
09d0: 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a  at() fills in).*
09e0: 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20  * and check for 
09f0: 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78  locks already ex
0a00: 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69  isting on that i
0a10: 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b  node.  When lock
0a20: 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64  s are.** created
0a30: 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20   or removed, we 
0a40: 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20  have to look at 
0a50: 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c  our own internal
0a60: 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a   record of the.*
0a70: 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69  * locks to see i
0a80: 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  f another thread
0a90: 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   has previously 
0aa0: 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  set a lock on th
0ab0: 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65  at same.** inode
0ac0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 73 46 69  ..**.** The OsFi
0ad0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  le structure for
0ae0: 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e   POSIX is no lon
0af0: 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65  ger just an inte
0b00: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
0b10: 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e  riptor.  It is n
0b20: 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74  ow a structure t
0b30: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e  hat holds the in
0b40: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
0b50: 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70  scriptor and a p
0b60: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75  ointer to a stru
0b70: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
0b80: 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61  ibes the interna
0b90: 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  l.** locks on th
0ba0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
0bb0: 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73  inode.  There is
0bc0: 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   one locking str
0bd0: 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e  ucture.** per in
0be0: 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73  ode, so if the s
0bf0: 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65  ame inode is ope
0c00: 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20  ned twice, both 
0c10: 4f 73 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  OsFile structure
0c20: 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68  s.** point to th
0c30: 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73  e same locking s
0c40: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c  tructure.  The l
0c50: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
0c60: 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65   keeps.** a refe
0c70: 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20  rence count (so 
0c80: 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65  we will know whe
0c90: 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20  n to delete it) 
0ca0: 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66  and a "cnt".** f
0cb0: 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20  ield that tells 
0cc0: 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20  us its internal 
0cd0: 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e  lock status.  cn
0ce0: 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a  t==0 means the.*
0cf0: 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  * file is unlock
0d00: 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61  ed.  cnt==-1 mea
0d10: 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ns the file has 
0d20: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
0d30: 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e  k..** cnt>0 mean
0d40: 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74 20  s there are cnt 
0d50: 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20  shared locks on 
0d60: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
0d70: 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  Any attempt to l
0d80: 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20  ock or unlock a 
0d90: 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b  file first check
0da0: 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  s the locking.**
0db0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
0dc0: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
0dd0: 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76  call is only inv
0de0: 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a  oked to set a .*
0df0: 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20  * POSIX lock if 
0e00: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  the internal loc
0e10: 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e  k structure tran
0e20: 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a  sitions between.
0e30: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20  ** a locked and 
0e40: 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74  an unlocked stat
0e50: 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  e..*/../*.** An 
0e60: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
0e70: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
0e80: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
0e90: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
0ea0: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
0eb0: 75 6c 61 72 20 6c 6f 63 6b 49 6e 66 6f 20 73 74  ular lockInfo st
0ec0: 72 75 63 74 75 72 65 20 67 69 76 65 6e 20 69 74  ructure given it
0ed0: 73 20 69 6e 6f 64 65 2e 20 0a 2a 2f 0a 73 74 72  s inode. .*/.str
0ee0: 75 63 74 20 69 6e 6f 64 65 4b 65 79 20 7b 0a 20  uct inodeKey {. 
0ef0: 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 2f 2a   dev_t dev;   /*
0f00: 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a   Device number *
0f10: 2f 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20  /.  ino_t ino;  
0f20: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
0f30: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
0f40: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
0f50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
0f60: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
0f70: 64 20 66 6f 72 20 65 61 63 68 20 69 6e 6f 64 65  d for each inode
0f80: 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e  ..** A single in
0f90: 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  ode can have mul
0fa0: 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72  tiple file descr
0fb0: 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20  iptors, so each 
0fc0: 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  OsFile.** struct
0fd0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
0fe0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
0ff0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
1000: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
1010: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
1020: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
1030: 62 65 72 20 6f 66 20 4f 73 46 69 6c 65 73 20 70  ber of OsFiles p
1040: 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a  ointing to it..*
1050: 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66  /.struct lockInf
1060: 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 69 6e 6f  o {.  struct ino
1070: 64 65 4b 65 79 20 6b 65 79 3b 20 20 2f 2a 20 54  deKey key;  /* T
1080: 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f  he lookup key */
1090: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
10a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 75           /* 0: u
10b0: 6e 6c 6f 63 6b 65 64 2e 20 20 2d 31 3a 20 77 72  nlocked.  -1: wr
10c0: 69 74 65 20 6c 6f 63 6b 2e 20 20 3e 3d 31 3a 20  ite lock.  >=1: 
10d0: 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  read lock */.  i
10e0: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
10f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1100: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  f pointers to th
1110: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
1120: 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  };../* .** This 
1130: 68 61 73 68 20 74 61 62 6c 65 20 6d 61 70 73 20  hash table maps 
1140: 69 6e 6f 64 65 73 20 28 69 6e 20 74 68 65 20 66  inodes (in the f
1150: 6f 72 6d 20 6f 66 20 69 6e 6f 64 65 4b 65 79 20  orm of inodeKey 
1160: 73 74 72 75 63 74 75 72 65 73 29 20 69 6e 74 6f  structures) into
1170: 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  .** pointers to 
1180: 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75  lockInfo structu
1190: 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 48  res..*/.static H
11a0: 61 73 68 20 6c 6f 63 6b 48 61 73 68 20 3d 20 7b  ash lockHash = {
11b0: 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 42 49 4e   SQLITE_HASH_BIN
11c0: 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  ARY, 0, 0, 0, 0,
11d0: 20 30 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   0 };../*.** Giv
11e0: 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  en a file descri
11f0: 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 61 20 6c  ptor, locate a l
1200: 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ockInfo structur
1210: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
1220: 0a 2a 2a 20 74 68 61 74 20 66 69 6c 65 20 64 65  .** that file de
1230: 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74  scriptor.  Creat
1240: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
1250: 65 63 65 73 73 61 72 79 2e 20 20 4e 55 4c 4c 20  ecessary.  NULL 
1260: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 72 65 74 75  might.** be retu
1270: 72 6e 65 64 20 69 66 20 6d 61 6c 6c 6f 63 28 29  rned if malloc()
1280: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
1290: 63 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66  c struct lockInf
12a0: 6f 20 2a 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28  o *findLockInfo(
12b0: 69 6e 74 20 66 64 29 7b 0a 20 20 69 6e 74 20 72  int fd){.  int r
12c0: 63 3b 0a 20 20 73 74 72 75 63 74 20 69 6e 6f 64  c;.  struct inod
12d0: 65 4b 65 79 20 6b 65 79 3b 0a 20 20 73 74 72 75  eKey key;.  stru
12e0: 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
12f0: 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  .  struct lockIn
1300: 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 72 63 20  fo *pInfo;.  rc 
1310: 3d 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61  = fstat(fd, &sta
1320: 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  tbuf);.  if( rc!
1330: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1340: 20 6b 65 79 2e 64 65 76 20 3d 20 73 74 61 74 62   key.dev = statb
1350: 75 66 2e 73 74 5f 64 65 76 3b 0a 20 20 6b 65 79  uf.st_dev;.  key
1360: 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73  .ino = statbuf.s
1370: 74 5f 69 6e 6f 3b 0a 20 20 70 49 6e 66 6f 20 3d  t_ino;.  pInfo =
1380: 20 28 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66   (struct lockInf
1390: 6f 2a 29 73 71 6c 69 74 65 48 61 73 68 46 69 6e  o*)sqliteHashFin
13a0: 64 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 6b 65  d(&lockHash, &ke
13b0: 79 2c 20 73 69 7a 65 6f 66 28 6b 65 79 29 29 3b  y, sizeof(key));
13c0: 0a 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20  .  if( pInfo==0 
13d0: 29 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20 73  ){.    pInfo = s
13e0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
13f0: 65 6f 66 28 2a 70 49 6e 66 6f 29 20 29 3b 0a 20  eof(*pInfo) );. 
1400: 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20     if( pInfo==0 
1410: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1420: 70 49 6e 66 6f 2d 3e 6b 65 79 20 3d 20 6b 65 79  pInfo->key = key
1430: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 52 65  ;.    pInfo->nRe
1440: 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e 66 6f  f = 1;.    pInfo
1450: 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73  ->cnt = 0;.    s
1460: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
1470: 26 6c 6f 63 6b 48 61 73 68 2c 20 26 70 49 6e 66  &lockHash, &pInf
1480: 6f 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 6b  o->key, sizeof(k
1490: 65 79 29 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d  ey), pInfo);.  }
14a0: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  else{.    pInfo-
14b0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72  >nRef++;.  }.  r
14c0: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
14d0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
14e0: 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75  lockInfo structu
14f0: 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c  re previously al
1500: 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64 4c  located by findL
1510: 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74  ockInfo()..*/.st
1520: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
1530: 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72 75 63 74  eLockInfo(struct
1540: 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 49 6e 66 6f   lockInfo *pInfo
1550: 29 7b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 52 65 66  ){.  pInfo->nRef
1560: 2d 2d 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d  --;.  if( pInfo-
1570: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
1580: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
1590: 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 70 49 6e  (&lockHash, &pIn
15a0: 66 6f 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28  fo->key, sizeof(
15b0: 70 49 6e 66 6f 2d 3e 6b 65 79 29 2c 20 30 29 3b  pInfo->key), 0);
15c0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
15d0: 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 23 65  pInfo);.  }.}.#e
15e0: 6e 64 69 66 20 20 2f 2a 2a 20 50 4f 53 49 58 20  ndif  /** POSIX 
15f0: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 77 6f  advisory lock wo
1600: 72 6b 2d 61 72 6f 75 6e 64 20 2a 2a 2f 0a 0a 0a  rk-around **/...
1610: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
1620: 20 6e 61 6d 65 64 20 66 69 6c 65 0a 2a 2f 0a 69   named file.*/.i
1630: 6e 74 20 73 71 6c 69 74 65 4f 73 44 65 6c 65 74  nt sqliteOsDelet
1640: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
1650: 69 6c 65 6e 61 6d 65 29 7b 0a 23 69 66 20 4f 53  ilename){.#if OS
1660: 5f 55 4e 49 58 0a 20 20 75 6e 6c 69 6e 6b 28 7a  _UNIX.  unlink(z
1670: 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69  Filename);.#endi
1680: 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 44  f.#if OS_WIN.  D
1690: 65 6c 65 74 65 46 69 6c 65 28 7a 46 69 6c 65 6e  eleteFile(zFilen
16a0: 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  ame);.#endif.  r
16b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
16d0: 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d   TRUE if the nam
16e0: 65 64 20 66 69 6c 65 20 65 78 69 73 74 73 2e 0a  ed file exists..
16f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 46  */.int sqliteOsF
1700: 69 6c 65 45 78 69 73 74 73 28 63 6f 6e 73 74 20  ileExists(const 
1710: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
1720: 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20  {.#if OS_UNIX.  
1730: 72 65 74 75 72 6e 20 61 63 63 65 73 73 28 7a 46  return access(zF
1740: 69 6c 65 6e 61 6d 65 2c 20 30 29 3d 3d 30 3b 0a  ilename, 0)==0;.
1750: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49  #endif.#if OS_WI
1760: 4e 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20  N.  HANDLE h;.  
1770: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 28 7a  h = CreateFile(z
1780: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 47 45  Filename,.    GE
1790: 4e 45 52 49 43 5f 52 45 41 44 2c 0a 20 20 20 20  NERIC_READ,.    
17a0: 30 2c 0a 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20  0,.    NULL,.   
17b0: 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 2c 0a   OPEN_EXISTING,.
17c0: 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55      FILE_ATTRIBU
17d0: 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c 45  TE_NORMAL | FILE
17e0: 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43  _FLAG_RANDOM_ACC
17f0: 45 53 53 2c 0a 20 20 20 20 4e 55 4c 4c 0a 20 20  ESS,.    NULL.  
1800: 29 3b 0a 20 20 69 66 28 20 68 21 3d 49 4e 56 41  );.  if( h!=INVA
1810: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
1820: 20 29 7b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e   ){.    CloseHan
1830: 64 6c 65 28 68 29 3b 0a 20 20 20 20 72 65 74 75  dle(h);.    retu
1840: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
1850: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 0;.#endif.}..
1860: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
1870: 6f 20 6f 70 65 6e 20 61 20 66 69 6c 65 20 66 6f  o open a file fo
1880: 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61  r both reading a
1890: 6e 64 20 77 72 69 74 69 6e 67 2e 20 20 49 66 20  nd writing.  If 
18a0: 74 68 61 74 0a 2a 2a 20 66 61 69 6c 73 2c 20 74  that.** fails, t
18b0: 72 79 20 6f 70 65 6e 69 6e 67 20 69 74 20 72 65  ry opening it re
18c0: 61 64 2d 6f 6e 6c 79 2e 20 20 49 66 20 74 68 65  ad-only.  If the
18d0: 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
18e0: 78 69 73 74 2c 0a 2a 2a 20 74 72 79 20 74 6f 20  xist,.** try to 
18f0: 63 72 65 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  create it..**.**
1900: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20 68   On success, a h
1910: 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 6f 70  andle for the op
1920: 65 6e 20 66 69 6c 65 20 69 73 20 77 72 69 74 74  en file is writt
1930: 65 6e 20 74 6f 20 2a 70 52 65 73 75 6c 74 0a 2a  en to *pResult.*
1940: 2a 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c 79  * and *pReadonly
1950: 20 69 73 20 73 65 74 20 74 6f 20 30 20 69 66 20   is set to 0 if 
1960: 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65  the file was ope
1970: 6e 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ned for reading 
1980: 61 6e 64 0a 2a 2a 20 77 72 69 74 69 6e 67 20 6f  and.** writing o
1990: 72 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  r 1 if the file 
19a0: 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d  was opened read-
19b0: 6f 6e 6c 79 2e 20 20 54 68 65 20 66 75 6e 63 74  only.  The funct
19c0: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53  ion returns.** S
19d0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
19e0: 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  On failure, the 
19f0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1a00: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1a10: 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20 2a   and leaves.** *
1a20: 70 52 65 73 75 6c 73 74 20 61 6e 64 20 2a 70 52  pResulst and *pR
1a30: 65 61 64 6f 6e 6c 79 20 75 6e 63 68 61 6e 67 65  eadonly unchange
1a40: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1a50: 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
1a60: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1a70: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 4f 73 46 69  Filename,.  OsFi
1a80: 6c 65 20 2a 70 52 65 73 75 6c 74 2c 0a 20 20 69  le *pResult,.  i
1a90: 6e 74 20 2a 70 52 65 61 64 6f 6e 6c 79 0a 29 7b  nt *pReadonly.){
1aa0: 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 4f  .#if OS_UNIX.  O
1ab0: 73 46 69 6c 65 20 73 3b 0a 20 20 73 2e 66 64 20  sFile s;.  s.fd 
1ac0: 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  = open(zFilename
1ad0: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
1ae0: 2c 20 30 36 34 34 29 3b 0a 20 20 69 66 28 20 73  , 0644);.  if( s
1af0: 2e 66 64 3c 30 20 29 7b 0a 20 20 20 20 73 2e 66  .fd<0 ){.    s.f
1b00: 64 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  d = open(zFilena
1b10: 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20  me, O_RDONLY);. 
1b20: 20 20 20 69 66 28 20 73 2e 66 64 3c 30 20 29 7b     if( s.fd<0 ){
1b30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1b40: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20 0a  LITE_CANTOPEN; .
1b50: 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 65 61 64      }.    *pRead
1b60: 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  only = 1;.  }els
1b70: 65 7b 0a 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c  e{.    *pReadonl
1b80: 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  y = 0;.  }.  sql
1b90: 69 74 65 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  iteOsEnterMutex(
1ba0: 29 3b 0a 20 20 73 2e 70 4c 6f 63 6b 20 3d 20 66  );.  s.pLock = f
1bb0: 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 73 2e 66 64  indLockInfo(s.fd
1bc0: 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73 4c 65 61  );.  sqliteOsLea
1bd0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
1be0: 20 73 2e 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20   s.pLock==0 ){. 
1bf0: 20 20 20 63 6c 6f 73 65 28 73 2e 66 64 29 3b 0a     close(s.fd);.
1c00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c10: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 2a  E_NOMEM;.  }.  *
1c20: 70 52 65 73 75 6c 74 20 3d 20 73 3b 0a 20 20 72  pResult = s;.  r
1c30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c40: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57  .#endif.#if OS_W
1c50: 49 4e 0a 20 20 48 41 4e 44 4c 45 20 68 20 3d 20  IN.  HANDLE h = 
1c60: 43 72 65 61 74 65 46 69 6c 65 28 7a 46 69 6c 65  CreateFile(zFile
1c70: 6e 61 6d 65 2c 0a 20 20 20 20 20 47 45 4e 45 52  name,.     GENER
1c80: 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49  IC_READ | GENERI
1c90: 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 46 49  C_WRITE,.     FI
1ca0: 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20  LE_SHARE_READ | 
1cb0: 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45  FILE_SHARE_WRITE
1cc0: 2c 0a 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20  ,.     NULL,.   
1cd0: 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20    OPEN_ALWAYS,. 
1ce0: 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55      FILE_ATTRIBU
1cf0: 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c 45  TE_NORMAL | FILE
1d00: 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43  _FLAG_RANDOM_ACC
1d10: 45 53 53 2c 0a 20 20 20 20 20 4e 55 4c 4c 0a 20  ESS,.     NULL. 
1d20: 20 29 3b 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56   );.  if( h==INV
1d30: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
1d40: 45 20 29 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20  E ){.    HANDLE 
1d50: 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 28 7a  h = CreateFile(z
1d60: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
1d70: 20 47 45 4e 45 52 49 43 5f 52 45 41 44 2c 0a 20   GENERIC_READ,. 
1d80: 20 20 20 20 20 20 46 49 4c 45 5f 53 48 41 52 45        FILE_SHARE
1d90: 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 4e 55  _READ,.       NU
1da0: 4c 4c 2c 0a 20 20 20 20 20 20 20 4f 50 45 4e 5f  LL,.       OPEN_
1db0: 41 4c 57 41 59 53 2c 0a 20 20 20 20 20 20 20 46  ALWAYS,.       F
1dc0: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
1dd0: 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47  RMAL | FILE_FLAG
1de0: 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a  _RANDOM_ACCESS,.
1df0: 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20         NULL.    
1e00: 29 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 49 4e  );.    if( h==IN
1e10: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
1e20: 55 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  UE ){.      retu
1e30: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
1e40: 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  EN;.    }.    *p
1e50: 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  Readonly = 1;.  
1e60: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52 65 61  }else{.    *pRea
1e70: 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  donly = 0;.  }. 
1e80: 20 2a 70 52 65 73 75 6c 74 20 3d 20 68 3b 0a 20   *pResult = h;. 
1e90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ea0: 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  K;.#endif.}.../*
1eb0: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f  .** Attempt to o
1ec0: 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 66  pen a new file f
1ed0: 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  or exclusive acc
1ee0: 65 73 73 20 62 79 20 74 68 69 73 20 70 72 6f 63  ess by this proc
1ef0: 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ess..** The file
1f00: 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
1f10: 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67  for both reading
1f20: 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20 20 54   and writing.  T
1f30: 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20 70 6f 74  o avoid.** a pot
1f40: 65 6e 74 69 61 6c 20 73 65 63 75 72 69 74 79 20  ential security 
1f50: 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 6f 20 6e  problem, we do n
1f60: 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c  ot allow the fil
1f70: 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70 72 65  e to have.** pre
1f80: 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64 2e  viously existed.
1f90: 20 20 4e 6f 72 20 64 6f 20 77 65 20 61 6c 6c 6f    Nor do we allo
1fa0: 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  w the file to be
1fb0: 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a 20 6c   a symbolic.** l
1fc0: 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  ink..**.** On su
1fd0: 63 63 65 73 73 2c 20 77 72 69 74 65 20 74 68 65  ccess, write the
1fe0: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 6e 74   file handle int
1ff0: 6f 20 2a 70 52 65 73 75 6c 74 20 61 6e 64 20 72  o *pResult and r
2000: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
2010: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72  .**.** On failur
2020: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
2030: 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e  _CANTOPEN..*/.in
2040: 74 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 45 78  t sqliteOsOpenEx
2050: 63 6c 75 73 69 76 65 28 63 6f 6e 73 74 20 63 68  clusive(const ch
2060: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f  ar *zFilename, O
2070: 73 46 69 6c 65 20 2a 70 52 65 73 75 6c 74 29 7b  sFile *pResult){
2080: 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 4f  .#if OS_UNIX.  O
2090: 73 46 69 6c 65 20 73 3b 0a 20 20 69 66 28 20 61  sFile s;.  if( a
20a0: 63 63 65 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c  ccess(zFilename,
20b0: 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   0)==0 ){.    re
20c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
20d0: 4f 50 45 4e 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  OPEN;.  }.#ifnde
20e0: 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64  f O_NOFOLLOW.# d
20f0: 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  efine O_NOFOLLOW
2100: 20 30 0a 23 65 6e 64 69 66 0a 20 20 73 2e 66 64   0.#endif.  s.fd
2110: 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   = open(zFilenam
2120: 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  e, O_RDWR|O_CREA
2130: 54 7c 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c  T|O_EXCL|O_NOFOL
2140: 4c 4f 57 2c 20 30 36 30 30 29 3b 0a 20 20 69 66  LOW, 0600);.  if
2150: 28 20 73 2e 66 64 3c 30 20 29 7b 0a 20 20 20 20  ( s.fd<0 ){.    
2160: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
2170: 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 73 71  NTOPEN;.  }.  sq
2180: 6c 69 74 65 4f 73 45 6e 74 65 72 4d 75 74 65 78  liteOsEnterMutex
2190: 28 29 3b 0a 20 20 73 2e 70 4c 6f 63 6b 20 3d 20  ();.  s.pLock = 
21a0: 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 73 2e 66  findLockInfo(s.f
21b0: 64 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73 4c 65  d);.  sqliteOsLe
21c0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  aveMutex();.  if
21d0: 28 20 73 2e 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ( s.pLock==0 ){.
21e0: 20 20 20 20 63 6c 6f 73 65 28 73 2e 66 64 29 3b      close(s.fd);
21f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2200: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
2210: 2a 70 52 65 73 75 6c 74 20 3d 20 73 3b 0a 20 20  *pResult = s;.  
2220: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2230: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f  ;.#endif.#if OS_
2240: 57 49 4e 0a 20 20 48 41 4e 44 4c 45 20 68 20 3d  WIN.  HANDLE h =
2250: 20 43 72 65 61 74 65 46 69 6c 65 28 7a 46 69 6c   CreateFile(zFil
2260: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 47 45 4e 45  ename,.     GENE
2270: 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52  RIC_READ | GENER
2280: 49 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 30  IC_WRITE,.     0
2290: 2c 0a 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20  ,.     NULL,.   
22a0: 20 20 43 52 45 41 54 45 5f 41 4c 57 41 59 53 2c    CREATE_ALWAYS,
22b0: 0a 20 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49  .     FILE_ATTRI
22c0: 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49  BUTE_NORMAL | FI
22d0: 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
22e0: 43 43 45 53 53 2c 0a 20 20 20 20 20 4e 55 4c 4c  CCESS,.     NULL
22f0: 0a 20 20 29 3b 0a 20 20 69 66 28 20 68 3d 3d 49  .  );.  if( h==I
2300: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
2310: 4c 55 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LUE ){.    retur
2320: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
2330: 4e 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 75 6c  N;.  }.  *pResul
2340: 74 20 3d 20 68 3b 0a 20 20 72 65 74 75 72 6e 20  t = h;.  return 
2350: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
2360: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  f.}../*.** Attem
2370: 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77  pt to open a new
2380: 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2d 6f   file for read-o
2390: 6e 6c 79 20 61 63 63 65 73 73 2e 0a 2a 2a 0a 2a  nly access..**.*
23a0: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77 72  * On success, wr
23b0: 69 74 65 20 74 68 65 20 66 69 6c 65 20 68 61 6e  ite the file han
23c0: 64 6c 65 20 69 6e 74 6f 20 2a 70 52 65 73 75 6c  dle into *pResul
23d0: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  t and return SQL
23e0: 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  ITE_OK..**.** On
23f0: 20 66 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e   failure, return
2400: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2410: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f  ..*/.int sqliteO
2420: 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 63 6f  sOpenReadOnly(co
2430: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
2440: 61 6d 65 2c 20 4f 73 46 69 6c 65 20 2a 70 52 65  ame, OsFile *pRe
2450: 73 75 6c 74 29 7b 0a 23 69 66 20 4f 53 5f 55 4e  sult){.#if OS_UN
2460: 49 58 0a 20 20 4f 73 46 69 6c 65 20 73 3b 0a 20  IX.  OsFile s;. 
2470: 20 73 2e 66 64 20 3d 20 6f 70 65 6e 28 7a 46 69   s.fd = open(zFi
2480: 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59  lename, O_RDONLY
2490: 29 3b 0a 20 20 69 66 28 20 73 2e 66 64 3c 30 20  );.  if( s.fd<0 
24a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
24b0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
24c0: 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73 45 6e 74   }.  sqliteOsEnt
24d0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 73 2e 70  erMutex();.  s.p
24e0: 4c 6f 63 6b 20 3d 20 66 69 6e 64 4c 6f 63 6b 49  Lock = findLockI
24f0: 6e 66 6f 28 73 2e 66 64 29 3b 0a 20 20 73 71 6c  nfo(s.fd);.  sql
2500: 69 74 65 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  iteOsLeaveMutex(
2510: 29 3b 0a 20 20 69 66 28 20 73 2e 70 4c 6f 63 6b  );.  if( s.pLock
2520: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65  ==0 ){.    close
2530: 28 73 2e 66 64 29 3b 0a 20 20 20 20 72 65 74 75  (s.fd);.    retu
2540: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2550: 0a 20 20 7d 0a 20 20 2a 70 52 65 73 75 6c 74 20  .  }.  *pResult 
2560: 3d 20 73 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = s;.  return SQ
2570: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
2580: 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 48 41 4e  #if OS_WIN.  HAN
2590: 44 4c 45 20 68 20 3d 20 43 72 65 61 74 65 46 69  DLE h = CreateFi
25a0: 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  le(zFilename,.  
25b0: 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 2c     GENERIC_READ,
25c0: 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 4e 55  .     0,.     NU
25d0: 4c 4c 2c 0a 20 20 20 20 20 4f 50 45 4e 5f 45 58  LL,.     OPEN_EX
25e0: 49 53 54 49 4e 47 2c 0a 20 20 20 20 20 46 49 4c  ISTING,.     FIL
25f0: 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d  E_ATTRIBUTE_NORM
2600: 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52  AL | FILE_FLAG_R
2610: 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20  ANDOM_ACCESS,.  
2620: 20 20 20 4e 55 4c 4c 0a 20 20 29 3b 0a 20 20 69     NULL.  );.  i
2630: 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  f( h==INVALID_HA
2640: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20  NDLE_VALUE ){.  
2650: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2660: 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20  CANTOPEN;.  }.  
2670: 2a 70 52 65 73 75 6c 74 20 3d 20 68 3b 0a 20 20  *pResult = h;.  
2680: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2690: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
26a0: 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
26b0: 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  rary file name i
26c0: 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75  n zBuf.  zBuf mu
26d0: 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68  st be big enough
26e0: 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 6c   to.** hold at l
26f0: 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50  east SQLITE_TEMP
2700: 4e 41 4d 45 5f 53 49 5a 45 20 63 68 61 72 61 63  NAME_SIZE charac
2710: 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ters..*/.int sql
2720: 69 74 65 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d  iteOsTempFileNam
2730: 65 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 23  e(char *zBuf){.#
2740: 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 73 74 61  if OS_UNIX.  sta
2750: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2760: 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  azDirs[] = {.   
2770: 20 20 22 2e 22 2c 0a 20 20 20 20 20 22 2f 76 61    ".",.     "/va
2780: 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75  r/tmp",.     "/u
2790: 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  sr/tmp",.     "/
27a0: 74 6d 70 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61  tmp",.  };.  sta
27b0: 74 69 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b  tic char zChars[
27c0: 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67  ] =.    "abcdefg
27d0: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
27e0: 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46  xyz".    "ABCDEF
27f0: 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
2800: 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34  WXYZ".    "01234
2810: 35 36 37 38 39 22 3b 0a 20 20 69 6e 74 20 69 2c  56789";.  int i,
2820: 20 6a 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   j;.  struct sta
2830: 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63  t buf;.  const c
2840: 68 61 72 20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b  har *zDir = ".";
2850: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
2860: 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a  zeof(azDirs)/siz
2870: 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20  eof(azDirs[0]); 
2880: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
2890: 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62  at(azDirs[i], &b
28a0: 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  uf) ) continue;.
28b0: 20 20 20 20 69 66 28 20 21 53 5f 49 53 44 49 52      if( !S_ISDIR
28c0: 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20  (buf.st_mode) ) 
28d0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
28e0: 28 20 61 63 63 65 73 73 28 61 7a 44 69 72 73 5b  ( access(azDirs[
28f0: 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e  i], 07) ) contin
2900: 75 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61  ue;.    zDir = a
2910: 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72  zDirs[i];.    br
2920: 65 61 6b 3b 0a 20 20 7d 0a 20 20 64 6f 7b 0a 20  eak;.  }.  do{. 
2930: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
2940: 20 22 25 73 2f 73 71 6c 69 74 65 5f 22 2c 20 7a   "%s/sqlite_", z
2950: 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74  Dir);.    j = st
2960: 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20  rlen(zBuf);.    
2970: 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69  for(i=0; i<15; i
2980: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
2990: 20 3d 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d 42   = sqliteRandomB
29a0: 79 74 65 28 29 20 25 20 28 73 69 7a 65 6f 66 28  yte() % (sizeof(
29b0: 7a 43 68 61 72 73 29 2d 31 29 3b 0a 20 20 20 20  zChars)-1);.    
29c0: 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 43    zBuf[j++] = zC
29d0: 68 61 72 73 5b 6e 5d 3b 0a 20 20 20 20 7d 0a 20  hars[n];.    }. 
29e0: 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a     zBuf[j] = 0;.
29f0: 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73 73    }while( access
2a00: 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 23  (zBuf,0)==0 );.#
2a10: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e  endif.#if OS_WIN
2a20: 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
2a30: 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61  Chars[] =.    "a
2a40: 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
2a50: 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22  rstuvwxyz".    "
2a60: 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
2a70: 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20  QRSTUVWXYZ".    
2a80: 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20  "0123456789";.  
2a90: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72  int i, j;.  char
2aa0: 20 7a 54 65 6d 70 50 61 74 68 5b 53 51 4c 49 54   zTempPath[SQLIT
2ab0: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d  E_TEMPNAME_SIZE]
2ac0: 3b 0a 20 20 47 65 74 54 65 6d 70 50 61 74 68 28  ;.  GetTempPath(
2ad0: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
2ae0: 53 49 5a 45 2d 33 30 2c 20 7a 54 65 6d 70 50 61  SIZE-30, zTempPa
2af0: 74 68 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  th);.  for(;;){.
2b00: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
2b10: 2c 20 22 25 73 2f 73 71 6c 69 74 65 5f 22 2c 20  , "%s/sqlite_", 
2b20: 7a 54 65 6d 70 50 61 74 68 29 3b 0a 20 20 20 20  zTempPath);.    
2b30: 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29  j = strlen(zBuf)
2b40: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2b50: 3c 31 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  <15; i++){.     
2b60: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 52   int n = sqliteR
2b70: 61 6e 64 6f 6d 42 79 74 65 28 29 20 25 20 73 69  andomByte() % si
2b80: 7a 65 6f 66 28 7a 43 68 61 72 73 29 3b 0a 20 20  zeof(zChars);.  
2b90: 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20      zBuf[j++] = 
2ba0: 7a 43 68 61 72 73 5b 6e 5d 3b 0a 20 20 20 20 7d  zChars[n];.    }
2bb0: 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30  .    zBuf[j] = 0
2bc0: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
2bd0: 65 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 42  eOsFileExists(zB
2be0: 75 66 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  uf) ) break;.  }
2bf0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
2c00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a   SQLITE_OK; .}..
2c10: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
2c20: 6c 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  le.*/.int sqlite
2c30: 4f 73 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20 69  OsClose(OsFile i
2c40: 64 29 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a  d){.#if OS_UNIX.
2c50: 20 20 63 6c 6f 73 65 28 69 64 2e 66 64 29 3b 0a    close(id.fd);.
2c60: 20 20 73 71 6c 69 74 65 4f 73 45 6e 74 65 72 4d    sqliteOsEnterM
2c70: 75 74 65 78 28 29 3b 0a 20 20 72 65 6c 65 61 73  utex();.  releas
2c80: 65 4c 6f 63 6b 49 6e 66 6f 28 69 64 2e 70 4c 6f  eLockInfo(id.pLo
2c90: 63 6b 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73 4c  ck);.  sqliteOsL
2ca0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
2cb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2cc0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57  .#endif.#if OS_W
2cd0: 49 4e 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65  IN.  CloseHandle
2ce0: 28 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (id);.  return S
2cf0: 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
2d00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
2d10: 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
2d20: 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
2d30: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
2d40: 72 20 6f 66 0a 2a 2a 20 62 79 74 65 73 20 61 63  r of.** bytes ac
2d50: 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2f 0a  tually read..*/.
2d60: 69 6e 74 20 73 71 6c 69 74 65 4f 73 52 65 61 64  int sqliteOsRead
2d70: 28 4f 73 46 69 6c 65 20 69 64 2c 20 76 6f 69 64  (OsFile id, void
2d80: 20 2a 70 42 75 66 2c 20 69 6e 74 20 61 6d 74 29   *pBuf, int amt)
2d90: 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20  {.#if OS_UNIX.  
2da0: 69 6e 74 20 67 6f 74 3b 0a 20 20 67 6f 74 20 3d  int got;.  got =
2db0: 20 72 65 61 64 28 69 64 2e 66 64 2c 20 70 42 75   read(id.fd, pBu
2dc0: 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67  f, amt);.  if( g
2dd0: 6f 74 3c 30 20 29 20 67 6f 74 20 3d 20 30 3b 0a  ot<0 ) got = 0;.
2de0: 20 20 72 65 74 75 72 6e 20 67 6f 74 3d 3d 61 6d    return got==am
2df0: 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  t ? SQLITE_OK : 
2e00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 23 65  SQLITE_IOERR;.#e
2e10: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a  ndif.#if OS_WIN.
2e20: 20 20 44 57 4f 52 44 20 67 6f 74 3b 0a 20 20 69    DWORD got;.  i
2e30: 66 28 20 21 52 65 61 64 46 69 6c 65 28 69 64 2c  f( !ReadFile(id,
2e40: 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 67 6f 74   pBuf, amt, &got
2e50: 2c 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 20  , 0) ){.    got 
2e60: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
2e70: 6e 20 67 6f 74 3d 3d 61 6d 74 20 3f 20 53 51 4c  n got==amt ? SQL
2e80: 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f  ITE_OK : SQLITE_
2e90: 49 4f 45 52 52 3b 0a 23 65 6e 64 69 66 0a 7d 0a  IOERR;.#endif.}.
2ea0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74  ./*.** Write dat
2eb0: 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
2ec0: 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65  into a file.  Re
2ed0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
2ee0: 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20  n success.** or 
2ef0: 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
2f00: 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65   code on failure
2f10: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f  ..*/.int sqliteO
2f20: 73 57 72 69 74 65 28 4f 73 46 69 6c 65 20 69 64  sWrite(OsFile id
2f30: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42  , const void *pB
2f40: 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 23 69  uf, int amt){.#i
2f50: 66 20 4f 53 5f 55 4e 49 58 0a 20 20 69 6e 74 20  f OS_UNIX.  int 
2f60: 77 72 6f 74 65 3b 0a 20 20 77 72 6f 74 65 20 3d  wrote;.  wrote =
2f70: 20 77 72 69 74 65 28 69 64 2e 66 64 2c 20 70 42   write(id.fd, pB
2f80: 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20  uf, amt);.  if( 
2f90: 77 72 6f 74 65 3c 61 6d 74 20 29 20 72 65 74 75  wrote<amt ) retu
2fa0: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
2fb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2fc0: 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f  OK;.#endif.#if O
2fd0: 53 5f 57 49 4e 0a 20 20 44 57 4f 52 44 20 77 72  S_WIN.  DWORD wr
2fe0: 6f 74 65 3b 0a 20 20 69 66 28 20 21 57 72 69 74  ote;.  if( !Writ
2ff0: 65 46 69 6c 65 28 69 64 2c 20 70 42 75 66 2c 20  eFile(id, pBuf, 
3000: 61 6d 74 2c 20 26 77 72 6f 74 65 2c 20 30 29 20  amt, &wrote, 0) 
3010: 7c 7c 20 77 72 6f 74 65 3c 61 6d 74 20 29 7b 0a  || wrote<amt ){.
3020: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3030: 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65  E_FULL;.  }.  re
3040: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3050: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
3060: 4d 6f 76 65 20 74 68 65 20 72 65 61 64 2f 77 72  Move the read/wr
3070: 69 74 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 61  ite pointer in a
3080: 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   file..*/.int sq
3090: 6c 69 74 65 4f 73 53 65 65 6b 28 4f 73 46 69 6c  liteOsSeek(OsFil
30a0: 65 20 69 64 2c 20 69 6e 74 20 6f 66 66 73 65 74  e id, int offset
30b0: 29 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20  ){.#if OS_UNIX. 
30c0: 20 6c 73 65 65 6b 28 69 64 2e 66 64 2c 20 6f 66   lseek(id.fd, of
30d0: 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  fset, SEEK_SET);
30e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
30f0: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  _OK;.#endif.#if 
3100: 4f 53 5f 57 49 4e 0a 20 20 53 65 74 46 69 6c 65  OS_WIN.  SetFile
3110: 50 6f 69 6e 74 65 72 28 69 64 2c 20 6f 66 66 73  Pointer(id, offs
3120: 65 74 2c 20 30 2c 20 46 49 4c 45 5f 42 45 47 49  et, 0, FILE_BEGI
3130: 4e 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  N);.  return SQL
3140: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d  ITE_OK;.#endif.}
3150: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
3160: 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
3170: 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
3180: 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
3190: 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  to disk..*/.int 
31a0: 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 4f 73 46  sqliteOsSync(OsF
31b0: 69 6c 65 20 69 64 29 7b 0a 23 69 66 20 4f 53 5f  ile id){.#if OS_
31c0: 55 4e 49 58 0a 20 20 72 65 74 75 72 6e 20 66 73  UNIX.  return fs
31d0: 79 6e 63 28 69 64 2e 66 64 29 3d 3d 30 20 3f 20  ync(id.fd)==0 ? 
31e0: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
31f0: 54 45 5f 49 4f 45 52 52 3b 0a 23 65 6e 64 69 66  TE_IOERR;.#endif
3200: 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 72 65  .#if OS_WIN.  re
3210: 74 75 72 6e 20 46 6c 75 73 68 46 69 6c 65 42 75  turn FlushFileBu
3220: 66 66 65 72 73 28 69 64 29 20 3f 20 53 51 4c 49  ffers(id) ? SQLI
3230: 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49  TE_OK : SQLITE_I
3240: 4f 45 52 52 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  OERR;.#endif.}..
3250: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
3260: 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
3270: 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
3280: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 54  */.int sqliteOsT
3290: 72 75 6e 63 61 74 65 28 4f 73 46 69 6c 65 20 69  runcate(OsFile i
32a0: 64 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 23  d, int nByte){.#
32b0: 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 72 65 74  if OS_UNIX.  ret
32c0: 75 72 6e 20 66 74 72 75 6e 63 61 74 65 28 69 64  urn ftruncate(id
32d0: 2e 66 64 2c 20 6e 42 79 74 65 29 3d 3d 30 20 3f  .fd, nByte)==0 ?
32e0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
32f0: 49 54 45 5f 49 4f 45 52 52 3b 0a 23 65 6e 64 69  ITE_IOERR;.#endi
3300: 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 53  f.#if OS_WIN.  S
3310: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 69 64  etFilePointer(id
3320: 2c 20 6e 42 79 74 65 2c 20 30 2c 20 46 49 4c 45  , nByte, 0, FILE
3330: 5f 42 45 47 49 4e 29 3b 0a 20 20 53 65 74 45 6e  _BEGIN);.  SetEn
3340: 64 4f 66 46 69 6c 65 28 69 64 29 3b 0a 20 20 72  dOfFile(id);.  r
3350: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3360: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
3370: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
3380: 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
3390: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
33a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 46 69  /.int sqliteOsFi
33b0: 6c 65 53 69 7a 65 28 4f 73 46 69 6c 65 20 69 64  leSize(OsFile id
33c0: 2c 20 69 6e 74 20 2a 70 53 69 7a 65 29 7b 0a 23  , int *pSize){.#
33d0: 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 73 74 72  if OS_UNIX.  str
33e0: 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
33f0: 69 66 28 20 66 73 74 61 74 28 69 64 2e 66 64 2c  if( fstat(id.fd,
3400: 20 26 62 75 66 29 21 3d 30 20 29 7b 0a 20 20 20   &buf)!=0 ){.   
3410: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
3420: 4f 45 52 52 3b 0a 20 20 7d 0a 20 20 2a 70 53 69  OERR;.  }.  *pSi
3430: 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65  ze = buf.st_size
3440: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
3450: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  E_OK;.#endif.#if
3460: 20 4f 53 5f 57 49 4e 0a 20 20 2a 70 53 69 7a 65   OS_WIN.  *pSize
3470: 20 3d 20 47 65 74 46 69 6c 65 53 69 7a 65 28 69   = GetFileSize(i
3480: 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  d, 0);.  return 
3490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
34a0: 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  f.}.../*.** Get 
34b0: 61 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  a read or write 
34c0: 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 0a  lock on a file..
34d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 4c  */.int sqliteOsL
34e0: 6f 63 6b 28 4f 73 46 69 6c 65 20 69 64 2c 20 69  ock(OsFile id, i
34f0: 6e 74 20 77 72 6c 6f 63 6b 29 7b 0a 23 69 66 20  nt wrlock){.#if 
3500: 4f 53 5f 55 4e 49 58 0a 20 20 69 6e 74 20 72 63  OS_UNIX.  int rc
3510: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 53 79 73 4c  ;.  int needSysL
3520: 6f 63 6b 3b 0a 20 20 73 71 6c 69 74 65 4f 73 45  ock;.  sqliteOsE
3530: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69  nterMutex();.  i
3540: 66 28 20 77 72 6c 6f 63 6b 20 29 7b 0a 20 20 20  f( wrlock ){.   
3550: 20 69 66 28 20 69 64 2e 70 4c 6f 63 6b 2d 3e 63   if( id.pLock->c
3560: 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  nt!=0 ){.      r
3570: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
3580: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3590: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
35a0: 3b 0a 20 20 20 20 20 20 69 64 2e 70 4c 6f 63 6b  ;.      id.pLock
35b0: 2d 3e 63 6e 74 20 3d 20 2d 31 3b 0a 20 20 20 20  ->cnt = -1;.    
35c0: 20 20 6e 65 65 64 53 79 73 4c 6f 63 6b 20 3d 20    needSysLock = 
35d0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
35e0: 7b 0a 20 20 20 20 69 66 28 20 69 64 2e 70 4c 6f  {.    if( id.pLo
35f0: 63 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ck<0 ){.      rc
3600: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
3610: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3620: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
3630: 0a 20 20 20 20 20 20 6e 65 65 64 53 79 73 4c 6f  .      needSysLo
3640: 63 6b 20 3d 20 69 64 2e 70 4c 6f 63 6b 2d 3e 63  ck = id.pLock->c
3650: 6e 74 3d 3d 30 3b 0a 20 20 20 20 20 20 69 64 2e  nt==0;.      id.
3660: 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20  pLock->cnt++;.  
3670: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
3680: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20  OsLeaveMutex(); 
3690: 20 20 20 20 20 0a 20 20 69 66 28 20 72 63 3d 3d       .  if( rc==
36a0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65  SQLITE_OK && nee
36b0: 64 53 79 73 4c 6f 63 6b 20 29 7b 20 0a 20 20 20  dSysLock ){ .   
36c0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
36d0: 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  ck;.    lock.l_t
36e0: 79 70 65 20 3d 20 77 72 6c 6f 63 6b 20 3f 20 46  ype = wrlock ? F
36f0: 5f 57 52 4c 43 4b 20 3a 20 46 5f 52 44 4c 43 4b  _WRLCK : F_RDLCK
3700: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
3710: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
3720: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
3730: 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20   = lock.l_len = 
3740: 30 4c 3b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e  0L;.    rc = fcn
3750: 74 6c 28 69 64 2e 66 64 2c 20 46 5f 53 45 54 4c  tl(id.fd, F_SETL
3760: 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 3f 20 53  K, &lock)==0 ? S
3770: 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
3780: 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 72 65  E_BUSY;.  }.  re
3790: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
37a0: 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 69 66 28  #if OS_WIN.  if(
37b0: 20 21 4c 6f 63 6b 46 69 6c 65 28 69 64 2c 20 30   !LockFile(id, 0
37c0: 2c 20 30 2c 20 31 30 32 34 2c 20 30 29 20 29 7b  , 0, 1024, 0) ){
37d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
37e0: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 72  TE_BUSY;.  }.  r
37f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3800: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
3810: 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 61   Release the rea
3820: 64 20 6f 72 20 77 72 69 74 65 20 6c 6f 63 6b 20  d or write lock 
3830: 66 72 6f 6d 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  from a file..*/.
3840: 69 6e 74 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f  int sqliteOsUnlo
3850: 63 6b 28 4f 73 46 69 6c 65 20 69 64 29 7b 0a 23  ck(OsFile id){.#
3860: 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 69 6e 74  if OS_UNIX.  int
3870: 20 72 63 3b 0a 20 20 69 6e 74 20 6e 65 65 64 53   rc;.  int needS
3880: 79 73 55 6e 6c 6f 63 6b 3b 0a 0a 20 20 73 71 6c  ysUnlock;..  sql
3890: 69 74 65 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  iteOsEnterMutex(
38a0: 29 3b 0a 20 20 69 66 28 20 69 64 2e 70 4c 6f 63  );.  if( id.pLoc
38b0: 6b 2d 3e 63 6e 74 3c 30 20 29 7b 0a 20 20 20 20  k->cnt<0 ){.    
38c0: 6e 65 65 64 53 79 73 55 6e 6c 6f 63 6b 20 3d 20  needSysUnlock = 
38d0: 31 3b 0a 20 20 20 20 69 64 2e 70 4c 6f 63 6b 2d  1;.    id.pLock-
38e0: 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  >cnt = 0;.  }els
38f0: 65 20 69 66 28 20 69 64 2e 70 4c 6f 63 6b 2d 3e  e if( id.pLock->
3900: 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 69 64 2e  cnt>0 ){.    id.
3910: 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20  pLock->cnt--;.  
3920: 20 20 6e 65 65 64 53 79 73 55 6e 6c 6f 63 6b 20    needSysUnlock 
3930: 3d 20 69 64 2e 70 4c 6f 63 6b 2d 3e 63 6e 74 3d  = id.pLock->cnt=
3940: 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
3950: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
3960: 0a 20 20 20 20 6e 65 65 64 53 79 73 55 6e 6c 6f  .    needSysUnlo
3970: 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  ck = 0;.  }.  sq
3980: 6c 69 74 65 4f 73 4c 65 61 76 65 4d 75 74 65 78  liteOsLeaveMutex
3990: 28 29 3b 0a 20 20 69 66 28 20 6e 65 65 64 53 79  ();.  if( needSy
39a0: 73 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73  sUnlock ){.    s
39b0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
39c0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
39d0: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
39e0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
39f0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
3a00: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f  ock.l_start = lo
3a10: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20  ck.l_len = 0L;. 
3a20: 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 69 64     rc = fcntl(id
3a30: 2e 66 64 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  .fd, F_SETLK, &l
3a40: 6f 63 6b 29 3d 3d 30 20 3f 20 53 51 4c 49 54 45  ock)==0 ? SQLITE
3a50: 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45  _OK : SQLITE_IOE
3a60: 52 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  RR;.  }.  return
3a70: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20   rc;.#endif.#if 
3a80: 4f 53 5f 57 49 4e 0a 20 20 72 65 74 75 72 6e 20  OS_WIN.  return 
3a90: 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2c 20 30  UnlockFile(id, 0
3aa0: 2c 20 30 2c 20 31 30 32 34 2c 20 30 29 20 3f 20  , 0, 1024, 0) ? 
3ab0: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
3ac0: 54 45 5f 49 4f 45 52 52 3b 0a 23 65 6e 64 69 66  TE_IOERR;.#endif
3ad0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 69 6e  .}../*.** Get in
3ae0: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 73 65 65  formation to see
3af0: 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d  d the random num
3b00: 62 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ber generator..*
3b10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 52 61  /.int sqliteOsRa
3b20: 6e 64 6f 6d 53 65 65 64 28 63 68 61 72 20 2a 7a  ndomSeed(char *z
3b30: 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 69  Buf){.  static i
3b40: 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 23 69 66  nt once = 1;.#if
3b50: 20 4f 53 5f 55 4e 49 58 0a 20 20 69 6e 74 20 70   OS_UNIX.  int p
3b60: 69 64 3b 0a 20 20 74 69 6d 65 28 28 74 69 6d 65  id;.  time((time
3b70: 5f 74 2a 29 7a 42 75 66 29 3b 0a 20 20 70 69 64  _t*)zBuf);.  pid
3b80: 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 6d   = getpid();.  m
3b90: 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65  emcpy(&zBuf[size
3ba0: 6f 66 28 74 69 6d 65 5f 74 29 5d 2c 20 26 70 69  of(time_t)], &pi
3bb0: 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b  d, sizeof(pid));
3bc0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57  .#endif.#if OS_W
3bd0: 49 4e 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69  IN.  GetSystemTi
3be0: 6d 65 28 28 4c 50 53 59 53 54 45 4d 54 49 4d 45  me((LPSYSTEMTIME
3bf0: 29 7a 42 75 66 29 3b 0a 23 65 6e 64 69 66 0a 20  )zBuf);.#endif. 
3c00: 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20   if( once ){.   
3c10: 20 69 6e 74 20 73 65 65 64 3b 0a 20 20 20 20 6d   int seed;.    m
3c20: 65 6d 63 70 79 28 26 73 65 65 64 2c 20 7a 42 75  emcpy(&seed, zBu
3c30: 66 2c 20 73 69 7a 65 6f 66 28 73 65 65 64 29 29  f, sizeof(seed))
3c40: 3b 0a 20 20 20 20 73 72 61 6e 64 28 73 65 65 64  ;.    srand(seed
3c50: 29 3b 0a 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b  );.    once = 0;
3c60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
3c70: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
3c80: 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
3c90: 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
3ca0: 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
3cb0: 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f  f time slept..*/
3cc0: 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 53 6c 65  .int sqliteOsSle
3cd0: 65 70 28 69 6e 74 20 6d 73 29 7b 0a 23 69 66 20  ep(int ms){.#if 
3ce0: 4f 53 5f 55 4e 49 58 0a 23 69 66 20 64 65 66 69  OS_UNIX.#if defi
3cf0: 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29  ned(HAVE_USLEEP)
3d00: 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a   && HAVE_USLEEP.
3d10: 20 20 75 73 6c 65 65 70 28 6d 73 2a 31 30 30 30    usleep(ms*1000
3d20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b 0a  );.  return ms;.
3d30: 23 65 6c 73 65 0a 20 20 73 6c 65 65 70 28 28 6d  #else.  sleep((m
3d40: 73 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20  s+999)/1000);.  
3d50: 72 65 74 75 72 6e 20 31 30 30 30 2a 28 28 6d 73  return 1000*((ms
3d60: 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 23 65 6e  +999)/1000);.#en
3d70: 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f  dif.#endif.#if O
3d80: 53 5f 57 49 4e 0a 20 20 53 6c 65 65 70 28 6d 73  S_WIN.  Sleep(ms
3d90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b 0a  );.  return ms;.
3da0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
3db0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  The following pa
3dc0: 69 72 20 6f 66 20 72 6f 75 74 69 6e 65 20 69 6d  ir of routine im
3dd0: 70 6c 65 6d 65 6e 74 20 6d 75 74 75 61 6c 20 65  plement mutual e
3de0: 78 63 6c 75 73 69 6f 6e 20 66 6f 72 0a 2a 2a 20  xclusion for.** 
3df0: 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20 70  multi-threaded p
3e00: 72 6f 63 65 73 73 65 73 2e 20 20 4f 6e 6c 79 20  rocesses.  Only 
3e10: 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64 20  a single thread 
3e20: 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 2a 2a  is allowed to.**
3e30: 20 65 78 65 63 75 74 65 64 20 63 6f 64 65 20 74   executed code t
3e40: 68 61 74 20 69 73 20 73 75 72 72 6f 75 6e 64 65  hat is surrounde
3e50: 64 20 62 79 20 45 6e 74 65 72 4d 75 74 65 78 28  d by EnterMutex(
3e60: 29 20 61 6e 64 20 4c 65 61 76 65 4d 75 74 65 78  ) and LeaveMutex
3e70: 28 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  ()..**.** SQLite
3e80: 20 75 73 65 73 20 6f 6e 6c 79 20 61 20 73 69 6e   uses only a sin
3e90: 67 6c 65 20 4d 75 74 65 78 2e 20 20 54 68 65 72  gle Mutex.  Ther
3ea0: 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 63 72  e is not much cr
3eb0: 69 74 69 63 61 6c 0a 2a 2a 20 63 6f 64 65 20 61  itical.** code a
3ec0: 6e 64 20 77 68 61 74 20 6c 69 74 74 6c 65 20 74  nd what little t
3ed0: 68 65 72 65 20 69 73 20 65 78 65 63 75 74 65 73  here is executes
3ee0: 20 71 75 69 63 6b 6c 79 20 61 6e 64 20 77 69 74   quickly and wit
3ef0: 68 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a  hout blocking..*
3f00: 2a 0a 2a 2a 2a 2a 2a 2a 20 54 42 44 3a 20 20 54  *.****** TBD:  T
3f10: 68 65 20 6d 75 74 65 78 20 69 73 20 63 75 72 72  he mutex is curr
3f20: 65 6e 74 6c 79 20 75 6e 69 6d 70 6c 65 6d 65 6e  ently unimplemen
3f30: 74 65 64 2e 20 20 55 6e 74 69 6c 20 69 74 20 69  ted.  Until it i
3f40: 73 0a 2a 2a 2a 2a 2a 2a 20 69 6d 70 6c 65 6d 65  s.****** impleme
3f50: 6e 74 65 64 2c 20 53 51 4c 69 74 65 20 69 73 20  nted, SQLite is 
3f60: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 0a  not threadsafe..
3f70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
3f80: 4d 75 74 65 78 20 3d 20 30 3b 0a 76 6f 69 64 20  Mutex = 0;.void 
3f90: 73 71 6c 69 74 65 4f 73 45 6e 74 65 72 4d 75 74  sqliteOsEnterMut
3fa0: 65 78 28 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ex(){.  assert( 
3fb0: 21 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20 69 6e  !inMutex );.  in
3fc0: 4d 75 74 65 78 20 3d 20 31 3b 0a 7d 0a 76 6f 69  Mutex = 1;.}.voi
3fd0: 64 20 73 71 6c 69 74 65 4f 73 4c 65 61 76 65 4d  d sqliteOsLeaveM
3fe0: 75 74 65 78 28 29 7b 0a 20 20 61 73 73 65 72 74  utex(){.  assert
3ff0: 28 20 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20 69  ( inMutex );.  i
4000: 6e 4d 75 74 65 78 20 3d 20 30 3b 0a 7d 0a        nMutex = 0;.}.