/ Hex Artifact Content
Login

Artifact 84549f6cc815237533c5d0eb3697352b03478d96:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 77 69 6e 64 6f 77 73 2e  ific to windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73  .*/.#include "os
01c0: 2e 68 22 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .h"          /* 
01d0: 4d 75 73 74 20 62 65 20 66 69 72 73 74 20 74 6f  Must be first to
01e0: 20 65 6e 61 62 6c 65 20 6c 61 72 67 65 20 66 69   enable large fi
01f0: 6c 65 20 73 75 70 70 6f 72 74 20 2a 2f 0a 23 69  le support */.#i
0200: 66 20 4f 53 5f 57 49 4e 20 20 20 20 20 20 20 20  f OS_WIN        
0210: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0220: 69 6c 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ile is used for 
0230: 77 69 6e 64 6f 77 73 20 6f 6e 6c 79 20 2a 2f 0a  windows only */.
0240: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0250: 49 6e 74 2e 68 22 0a 0a 23 69 6e 63 6c 75 64 65  Int.h"..#include
0260: 20 3c 77 69 6e 62 61 73 65 2e 68 3e 0a 0a 2f 2a   <winbase.h>../*
0270: 0a 2a 2a 20 4d 61 63 72 6f 73 20 75 73 65 64 20  .** Macros used 
0280: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
0290: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 6f 20 75  ther or not to u
02a0: 73 65 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 23  se threads..*/.#
02b0: 69 66 20 64 65 66 69 6e 65 64 28 54 48 52 45 41  if defined(THREA
02c0: 44 53 41 46 45 29 20 26 26 20 54 48 52 45 41 44  DSAFE) && THREAD
02d0: 53 41 46 45 0a 23 20 64 65 66 69 6e 65 20 53 51  SAFE.# define SQ
02e0: 4c 49 54 45 5f 57 33 32 5f 54 48 52 45 41 44 53  LITE_W32_THREADS
02f0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
0300: 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68   Include code th
0310: 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  at is common to 
0320: 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73  all os_*.c files
0330: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73  .*/.#include "os
0340: 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a  _common.h"../*.*
0350: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d  * Delete the nam
0360: 65 64 20 66 69 6c 65 0a 2a 2f 0a 69 6e 74 20 73  ed file.*/.int s
0370: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 63  qlite3OsDelete(c
0380: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
0390: 6e 61 6d 65 29 7b 0a 20 20 44 65 6c 65 74 65 46  name){.  DeleteF
03a0: 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ile(zFilename);.
03b0: 20 20 54 52 41 43 45 32 28 22 44 45 4c 45 54 45    TRACE2("DELETE
03c0: 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c   \"%s\"\n", zFil
03d0: 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  ename);.  return
03e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
03f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
0400: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69   if the named fi
0410: 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e  le exists..*/.in
0420: 74 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45  t sqlite3OsFileE
0430: 78 69 73 74 73 28 63 6f 6e 73 74 20 63 68 61 72  xists(const char
0440: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
0450: 72 65 74 75 72 6e 20 47 65 74 46 69 6c 65 41 74  return GetFileAt
0460: 74 72 69 62 75 74 65 73 28 7a 46 69 6c 65 6e 61  tributes(zFilena
0470: 6d 65 29 20 21 3d 20 30 78 66 66 66 66 66 66 66  me) != 0xfffffff
0480: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  f;.}../*.** Atte
0490: 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 66 69  mpt to open a fi
04a0: 6c 65 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64  le for both read
04b0: 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e  ing and writing.
04c0: 20 20 49 66 20 74 68 61 74 0a 2a 2a 20 66 61 69    If that.** fai
04d0: 6c 73 2c 20 74 72 79 20 6f 70 65 6e 69 6e 67 20  ls, try opening 
04e0: 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 49  it read-only.  I
04f0: 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  f the file does 
0500: 6e 6f 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74 72  not exist,.** tr
0510: 79 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 0a  y to create it..
0520: 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
0530: 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f 72 20 74  , a handle for t
0540: 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 69 73 20  he open file is 
0550: 77 72 69 74 74 65 6e 20 74 6f 20 2a 69 64 0a 2a  written to *id.*
0560: 2a 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c 79  * and *pReadonly
0570: 20 69 73 20 73 65 74 20 74 6f 20 30 20 69 66 20   is set to 0 if 
0580: 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65  the file was ope
0590: 6e 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ned for reading 
05a0: 61 6e 64 0a 2a 2a 20 77 72 69 74 69 6e 67 20 6f  and.** writing o
05b0: 72 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  r 1 if the file 
05c0: 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d  was opened read-
05d0: 6f 6e 6c 79 2e 20 20 54 68 65 20 66 75 6e 63 74  only.  The funct
05e0: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53  ion returns.** S
05f0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
0600: 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  On failure, the 
0610: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
0620: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
0630: 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20 2a   and leaves.** *
0640: 69 64 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c  id and *pReadonl
0650: 79 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  y unchanged..*/.
0660: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  int sqlite3OsOpe
0670: 6e 52 65 61 64 57 72 69 74 65 28 0a 20 20 63 6f  nReadWrite(.  co
0680: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
0690: 61 6d 65 2c 0a 20 20 4f 73 46 69 6c 65 20 2a 69  ame,.  OsFile *i
06a0: 64 2c 0a 20 20 69 6e 74 20 2a 70 52 65 61 64 6f  d,.  int *pReado
06b0: 6e 6c 79 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20  nly.){.  HANDLE 
06c0: 68 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 64  h;.  assert( !id
06d0: 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 68 20  ->isOpen );.  h 
06e0: 3d 20 43 72 65 61 74 65 46 69 6c 65 28 7a 46 69  = CreateFile(zFi
06f0: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 47 45 4e  lename,.     GEN
0700: 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45  ERIC_READ | GENE
0710: 52 49 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20  RIC_WRITE,.     
0720: 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20  FILE_SHARE_READ 
0730: 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49  | FILE_SHARE_WRI
0740: 54 45 2c 0a 20 20 20 20 20 4e 55 4c 4c 2c 0a 20  TE,.     NULL,. 
0750: 20 20 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c      OPEN_ALWAYS,
0760: 0a 20 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49  .     FILE_ATTRI
0770: 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49  BUTE_NORMAL | FI
0780: 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
0790: 43 43 45 53 53 2c 0a 20 20 20 20 20 4e 55 4c 4c  CCESS,.     NULL
07a0: 0a 20 20 29 3b 0a 20 20 69 66 28 20 68 3d 3d 49  .  );.  if( h==I
07b0: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
07c0: 4c 55 45 20 29 7b 0a 20 20 20 20 68 20 3d 20 43  LUE ){.    h = C
07d0: 72 65 61 74 65 46 69 6c 65 28 7a 46 69 6c 65 6e  reateFile(zFilen
07e0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 47 45 4e 45  ame,.       GENE
07f0: 52 49 43 5f 52 45 41 44 2c 0a 20 20 20 20 20 20  RIC_READ,.      
0800: 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44   FILE_SHARE_READ
0810: 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20  ,.       NULL,. 
0820: 20 20 20 20 20 20 4f 50 45 4e 5f 41 4c 57 41 59        OPEN_ALWAY
0830: 53 2c 0a 20 20 20 20 20 20 20 46 49 4c 45 5f 41  S,.       FILE_A
0840: 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 20  TTRIBUTE_NORMAL 
0850: 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44  | FILE_FLAG_RAND
0860: 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20 20 20  OM_ACCESS,.     
0870: 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 20    NULL.    );.  
0880: 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44    if( h==INVALID
0890: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b  _HANDLE_VALUE ){
08a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
08b0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
08c0: 20 20 20 7d 0a 20 20 20 20 2a 70 52 65 61 64 6f     }.    *pReado
08d0: 6e 6c 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  nly = 1;.  }else
08e0: 7b 0a 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79  {.    *pReadonly
08f0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e   = 0;.  }.  id->
0900: 68 20 3d 20 68 3b 0a 20 20 69 64 2d 3e 6c 6f 63  h = h;.  id->loc
0910: 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  ktype = NO_LOCK;
0920: 0a 20 20 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63  .  id->sharedLoc
0930: 6b 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 64 2d  kByte = 0;.  id-
0940: 3e 69 73 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 4f  >isOpen = 1;.  O
0950: 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
0960: 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20 52    TRACE3("OPEN R
0970: 2f 57 20 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c  /W %d \"%s\"\n",
0980: 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a   h, zFilename);.
0990: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
09a0: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74  OK;.}.../*.** At
09b0: 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20  tempt to open a 
09c0: 6e 65 77 20 66 69 6c 65 20 66 6f 72 20 65 78 63  new file for exc
09d0: 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 62 79  lusive access by
09e0: 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a   this process..*
09f0: 2a 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  * The file will 
0a00: 62 65 20 6f 70 65 6e 65 64 20 66 6f 72 20 62 6f  be opened for bo
0a10: 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77  th reading and w
0a20: 72 69 74 69 6e 67 2e 20 20 54 6f 20 61 76 6f 69  riting.  To avoi
0a30: 64 0a 2a 2a 20 61 20 70 6f 74 65 6e 74 69 61 6c  d.** a potential
0a40: 20 73 65 63 75 72 69 74 79 20 70 72 6f 62 6c 65   security proble
0a50: 6d 2c 20 77 65 20 64 6f 20 6e 6f 74 20 61 6c 6c  m, we do not all
0a60: 6f 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20 68  ow the file to h
0a70: 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c  ave.** previousl
0a80: 79 20 65 78 69 73 74 65 64 2e 20 20 4e 6f 72 20  y existed.  Nor 
0a90: 64 6f 20 77 65 20 61 6c 6c 6f 77 20 74 68 65 20  do we allow the 
0aa0: 66 69 6c 65 20 74 6f 20 62 65 20 61 20 73 79 6d  file to be a sym
0ab0: 62 6f 6c 69 63 0a 2a 2a 20 6c 69 6e 6b 2e 0a 2a  bolic.** link..*
0ac0: 2a 0a 2a 2a 20 49 66 20 64 65 6c 46 6c 61 67 20  *.** If delFlag 
0ad0: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6d 61  is true, then ma
0ae0: 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20  ke arrangements 
0af0: 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
0b00: 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68 65 20 66   delete.** the f
0b10: 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
0b20: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  losed..**.** On 
0b30: 73 75 63 63 65 73 73 2c 20 77 72 69 74 65 20 74  success, write t
0b40: 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69  he file handle i
0b50: 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72 65 74 75  nto *id and retu
0b60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
0b70: 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20  .** On failure, 
0b80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
0b90: 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73  NTOPEN..*/.int s
0ba0: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
0bb0: 75 73 69 76 65 28 63 6f 6e 73 74 20 63 68 61 72  usive(const char
0bc0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 73 46   *zFilename, OsF
0bd0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 64 65 6c  ile *id, int del
0be0: 46 6c 61 67 29 7b 0a 20 20 48 41 4e 44 4c 45 20  Flag){.  HANDLE 
0bf0: 68 3b 0a 20 20 69 6e 74 20 66 69 6c 65 66 6c 61  h;.  int filefla
0c00: 67 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69  gs;.  assert( !i
0c10: 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 69  d->isOpen );.  i
0c20: 66 28 20 64 65 6c 46 6c 61 67 20 29 7b 0a 20 20  f( delFlag ){.  
0c30: 20 20 66 69 6c 65 66 6c 61 67 73 20 3d 20 46 49    fileflags = FI
0c40: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d  LE_ATTRIBUTE_TEM
0c50: 50 4f 52 41 52 59 20 7c 20 46 49 4c 45 5f 46 4c  PORARY | FILE_FL
0c60: 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
0c70: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
0c80: 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c         | FILE_FL
0c90: 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f  AG_DELETE_ON_CLO
0ca0: 53 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SE;.  }else{.   
0cb0: 20 66 69 6c 65 66 6c 61 67 73 20 3d 20 46 49 4c   fileflags = FIL
0cc0: 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
0cd0: 43 45 53 53 3b 0a 20 20 7d 0a 20 20 68 20 3d 20  CESS;.  }.  h = 
0ce0: 43 72 65 61 74 65 46 69 6c 65 28 7a 46 69 6c 65  CreateFile(zFile
0cf0: 6e 61 6d 65 2c 0a 20 20 20 20 20 47 45 4e 45 52  name,.     GENER
0d00: 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49  IC_READ | GENERI
0d10: 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 30 2c  C_WRITE,.     0,
0d20: 0a 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20  .     NULL,.    
0d30: 20 43 52 45 41 54 45 5f 41 4c 57 41 59 53 2c 0a   CREATE_ALWAYS,.
0d40: 20 20 20 20 20 66 69 6c 65 66 6c 61 67 73 2c 0a       fileflags,.
0d50: 20 20 20 20 20 4e 55 4c 4c 0a 20 20 29 3b 0a 20       NULL.  );. 
0d60: 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f   if( h==INVALID_
0d70: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a  HANDLE_VALUE ){.
0d80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
0d90: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a  E_CANTOPEN;.  }.
0da0: 20 20 69 64 2d 3e 68 20 3d 20 68 3b 0a 20 20 69    id->h = h;.  i
0db0: 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f  d->locktype = NO
0dc0: 5f 4c 4f 43 4b 3b 0a 20 20 69 64 2d 3e 73 68 61  _LOCK;.  id->sha
0dd0: 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 30 3b  redLockByte = 0;
0de0: 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20  .  id->isOpen = 
0df0: 31 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  1;.  OpenCounter
0e00: 28 2b 31 29 3b 0a 20 20 54 52 41 43 45 33 28 22  (+1);.  TRACE3("
0e10: 4f 50 45 4e 20 45 58 20 25 64 20 5c 22 25 73 5c  OPEN EX %d \"%s\
0e20: 22 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61  "\n", h, zFilena
0e30: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  me);.  return SQ
0e40: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
0e50: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65  * Attempt to ope
0e60: 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 66 6f 72  n a new file for
0e70: 20 72 65 61 64 2d 6f 6e 6c 79 20 61 63 63 65 73   read-only acces
0e80: 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  s..**.** On succ
0e90: 65 73 73 2c 20 77 72 69 74 65 20 74 68 65 20 66  ess, write the f
0ea0: 69 6c 65 20 68 61 6e 64 6c 65 20 69 6e 74 6f 20  ile handle into 
0eb0: 2a 69 64 20 61 6e 64 20 72 65 74 75 72 6e 20 53  *id and return S
0ec0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
0ed0: 4f 6e 20 66 61 69 6c 75 72 65 2c 20 72 65 74 75  On failure, retu
0ee0: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
0ef0: 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  EN..*/.int sqlit
0f00: 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
0f10: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
0f20: 6c 65 6e 61 6d 65 2c 20 4f 73 46 69 6c 65 20 2a  lename, OsFile *
0f30: 69 64 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b  id){.  HANDLE h;
0f40: 0a 20 20 61 73 73 65 72 74 28 20 21 69 64 2d 3e  .  assert( !id->
0f50: 69 73 4f 70 65 6e 20 29 3b 0a 20 20 68 20 3d 20  isOpen );.  h = 
0f60: 43 72 65 61 74 65 46 69 6c 65 28 7a 46 69 6c 65  CreateFile(zFile
0f70: 6e 61 6d 65 2c 0a 20 20 20 20 20 47 45 4e 45 52  name,.     GENER
0f80: 49 43 5f 52 45 41 44 2c 0a 20 20 20 20 20 30 2c  IC_READ,.     0,
0f90: 0a 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20  .     NULL,.    
0fa0: 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 2c 0a   OPEN_EXISTING,.
0fb0: 20 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42       FILE_ATTRIB
0fc0: 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c  UTE_NORMAL | FIL
0fd0: 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
0fe0: 43 45 53 53 2c 0a 20 20 20 20 20 4e 55 4c 4c 0a  CESS,.     NULL.
0ff0: 20 20 29 3b 0a 20 20 69 66 28 20 68 3d 3d 49 4e    );.  if( h==IN
1000: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
1010: 55 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  UE ){.    return
1020: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1030: 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 68 20 3d 20  ;.  }.  id->h = 
1040: 68 3b 0a 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70  h;.  id->locktyp
1050: 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 69  e = NO_LOCK;.  i
1060: 64 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  d->sharedLockByt
1070: 65 20 3d 20 30 3b 0a 20 20 69 64 2d 3e 69 73 4f  e = 0;.  id->isO
1080: 70 65 6e 20 3d 20 31 3b 0a 20 20 4f 70 65 6e 43  pen = 1;.  OpenC
1090: 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 54 52  ounter(+1);.  TR
10a0: 41 43 45 33 28 22 4f 50 45 4e 20 52 4f 20 25 64  ACE3("OPEN RO %d
10b0: 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 68 2c 20 7a   \"%s\"\n", h, z
10c0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74  Filename);.  ret
10d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10e0: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
10f0: 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c 65 20 64  to open a file d
1100: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
1110: 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
1120: 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 66   contains a.** f
1130: 69 6c 65 2e 20 20 54 68 69 73 20 66 69 6c 65 20  ile.  This file 
1140: 64 65 73 63 72 69 70 74 6f 72 20 63 61 6e 20 62  descriptor can b
1150: 65 20 75 73 65 64 20 74 6f 20 66 73 79 6e 63 28  e used to fsync(
1160: 29 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  ) the directory.
1170: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d  ** in order to m
1180: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 72 65  ake sure the cre
1190: 61 74 69 6f 6e 20 6f 66 20 61 20 6e 65 77 20 66  ation of a new f
11a0: 69 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ile is actually 
11b0: 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 64 69  written.** to di
11c0: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sk..**.** This r
11d0: 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 6d  outine is only m
11e0: 65 61 6e 69 6e 67 66 75 6c 20 66 6f 72 20 55 6e  eaningful for Un
11f0: 69 78 2e 20 20 49 74 20 69 73 20 61 20 6e 6f 2d  ix.  It is a no-
1200: 6f 70 20 75 6e 64 65 72 0a 2a 2a 20 77 69 6e 64  op under.** wind
1210: 6f 77 73 20 73 69 6e 63 65 20 77 69 6e 64 6f 77  ows since window
1220: 73 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  s does not suppo
1230: 72 74 20 68 61 72 64 20 6c 69 6e 6b 73 2e 0a 2a  rt hard links..*
1240: 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
1250: 20 61 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20   a handle for a 
1260: 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 20  previously open 
1270: 66 69 6c 65 20 69 73 20 61 74 20 2a 69 64 20 69  file is at *id i
1280: 73 0a 2a 2a 20 75 70 64 61 74 65 64 20 77 69 74  s.** updated wit
1290: 68 20 74 68 65 20 6e 65 77 20 64 69 72 65 63 74  h the new direct
12a0: 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
12b0: 74 6f 72 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  tor and SQLITE_O
12c0: 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  K is.** returned
12d0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75  ..**.** On failu
12e0: 72 65 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  re, the function
12f0: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1300: 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20 6c 65 61  CANTOPEN and lea
1310: 76 65 73 0a 2a 2a 20 2a 69 64 20 75 6e 63 68 61  ves.** *id uncha
1320: 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
1330: 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74  ite3OsOpenDirect
1340: 6f 72 79 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ory(.  const cha
1350: 72 20 2a 7a 44 69 72 6e 61 6d 65 2c 0a 20 20 4f  r *zDirname,.  O
1360: 73 46 69 6c 65 20 2a 69 64 0a 29 7b 0a 20 20 72  sFile *id.){.  r
1370: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1380: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1390: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
13a0: 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20  e name in zBuf. 
13b0: 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62 69   zBuf must be bi
13c0: 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68  g enough to.** h
13d0: 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 53 51 4c  old at least SQL
13e0: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
13f0: 45 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f  E characters..*/
1400: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 54 65  .int sqlite3OsTe
1410: 6d 70 46 69 6c 65 4e 61 6d 65 28 63 68 61 72 20  mpFileName(char 
1420: 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63  *zBuf){.  static
1430: 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d   char zChars[] =
1440: 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a  .    "abcdefghij
1450: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
1460: 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49  ".    "ABCDEFGHI
1470: 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
1480: 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37  Z".    "01234567
1490: 38 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  89";.  int i, j;
14a0: 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 50 61 74  .  char zTempPat
14b0: 68 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  h[SQLITE_TEMPNAM
14c0: 45 5f 53 49 5a 45 5d 3b 0a 20 20 47 65 74 54 65  E_SIZE];.  GetTe
14d0: 6d 70 50 61 74 68 28 53 51 4c 49 54 45 5f 54 45  mpPath(SQLITE_TE
14e0: 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30 2c 20  MPNAME_SIZE-30, 
14f0: 7a 54 65 6d 70 50 61 74 68 29 3b 0a 20 20 66 6f  zTempPath);.  fo
1500: 72 28 69 3d 73 74 72 6c 65 6e 28 7a 54 65 6d 70  r(i=strlen(zTemp
1510: 50 61 74 68 29 3b 20 69 3e 30 20 26 26 20 7a 54  Path); i>0 && zT
1520: 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c  empPath[i-1]=='\
1530: 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54 65  \'; i--){}.  zTe
1540: 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a 20  mpPath[i] = 0;. 
1550: 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 73 70   for(;;){.    sp
1560: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 73 5c  rintf(zBuf, "%s\
1570: 5c 22 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  \"TEMP_FILE_PREF
1580: 49 58 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b 0a  IX, zTempPath);.
1590: 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a      j = strlen(z
15a0: 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Buf);.    sqlite
15b0: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  3Randomness(15, 
15c0: 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66  &zBuf[j]);.    f
15d0: 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b  or(i=0; i<15; i+
15e0: 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  +, j++){.      z
15f0: 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a  Buf[j] = (char)z
1600: 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65  Chars[ ((unsigne
1610: 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25  d char)zBuf[j])%
1620: 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d  (sizeof(zChars)-
1630: 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  1) ];.    }.    
1640: 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  zBuf[j] = 0;.   
1650: 20 69 66 28 20 21 73 71 6c 69 74 65 33 4f 73 46   if( !sqlite3OsF
1660: 69 6c 65 45 78 69 73 74 73 28 7a 42 75 66 29 20  ileExists(zBuf) 
1670: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54  ) break;.  }.  T
1680: 52 41 43 45 32 28 22 54 45 4d 50 20 46 49 4c 45  RACE2("TEMP FILE
1690: 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a 42 75  NAME: %s\n", zBu
16a0: 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  f);.  return SQL
16b0: 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  ITE_OK; .}../*.*
16c0: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
16d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73  */.int sqlite3Os
16e0: 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20 2a 69 64  Close(OsFile *id
16f0: 29 7b 0a 20 20 69 66 28 20 69 64 2d 3e 69 73 4f  ){.  if( id->isO
1700: 70 65 6e 20 29 7b 0a 20 20 20 20 54 52 41 43 45  pen ){.    TRACE
1710: 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  2("CLOSE %d\n", 
1720: 69 64 2d 3e 68 29 3b 0a 20 20 20 20 43 6c 6f 73  id->h);.    Clos
1730: 65 48 61 6e 64 6c 65 28 69 64 2d 3e 68 29 3b 0a  eHandle(id->h);.
1740: 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28      OpenCounter(
1750: 2d 31 29 3b 0a 20 20 20 20 69 64 2d 3e 69 73 4f  -1);.    id->isO
1760: 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  pen = 0;.  }.  r
1770: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1780: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
1790: 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
17a0: 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
17b0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
17c0: 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73   if all.** bytes
17d0: 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65   were read succe
17e0: 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49  ssfully and SQLI
17f0: 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74  TE_IOERR if anyt
1800: 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
1810: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
1820: 65 33 4f 73 52 65 61 64 28 4f 73 46 69 6c 65 20  e3OsRead(OsFile 
1830: 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c  *id, void *pBuf,
1840: 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20 44 57 4f   int amt){.  DWO
1850: 52 44 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74  RD got;.  assert
1860: 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a  ( id->isOpen );.
1870: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1880: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b  r(SQLITE_IOERR);
1890: 0a 20 20 54 52 41 43 45 33 28 22 52 45 41 44 20  .  TRACE3("READ 
18a0: 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 69  %d lock=%d\n", i
18b0: 64 2d 3e 68 2c 20 69 64 2d 3e 6c 6f 63 6b 74 79  d->h, id->lockty
18c0: 70 65 29 3b 0a 20 20 69 66 28 20 21 52 65 61 64  pe);.  if( !Read
18d0: 46 69 6c 65 28 69 64 2d 3e 68 2c 20 70 42 75 66  File(id->h, pBuf
18e0: 2c 20 61 6d 74 2c 20 26 67 6f 74 2c 20 30 29 20  , amt, &got, 0) 
18f0: 29 7b 0a 20 20 20 20 67 6f 74 20 3d 20 30 3b 0a  ){.    got = 0;.
1900: 20 20 7d 0a 20 20 69 66 28 20 67 6f 74 3d 3d 28    }.  if( got==(
1910: 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20  DWORD)amt ){.   
1920: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1930: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
1940: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1950: 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ERR;.  }.}../*.*
1960: 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f  * Write data fro
1970: 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20  m a buffer into 
1980: 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  a file.  Return 
1990: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
19a0: 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  cess.** or some 
19b0: 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
19c0: 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
19d0: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 57 72 69  int sqlite3OsWri
19e0: 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 63  te(OsFile *id, c
19f0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
1a00: 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20 69 6e 74   int amt){.  int
1a10: 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 77 72 6f   rc;.  DWORD wro
1a20: 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  te;.  assert( id
1a30: 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 53 69  ->isOpen );.  Si
1a40: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51  mulateIOError(SQ
1a50: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54  LITE_IOERR);.  T
1a60: 52 41 43 45 33 28 22 57 52 49 54 45 20 25 64 20  RACE3("WRITE %d 
1a70: 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 69 64 2d 3e  lock=%d\n", id->
1a80: 68 2c 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 29  h, id->locktype)
1a90: 3b 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30  ;.  while( amt>0
1aa0: 20 26 26 20 28 72 63 20 3d 20 57 72 69 74 65 46   && (rc = WriteF
1ab0: 69 6c 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ile(id->h, pBuf,
1ac0: 20 61 6d 74 2c 20 26 77 72 6f 74 65 2c 20 30 29   amt, &wrote, 0)
1ad0: 29 21 3d 30 20 26 26 20 77 72 6f 74 65 3e 30 20  )!=0 && wrote>0 
1ae0: 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72  ){.    amt -= wr
1af0: 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
1b00: 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
1b10: 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  rote];.  }.  if(
1b20: 20 21 72 63 20 7c 7c 20 61 6d 74 3e 28 69 6e 74   !rc || amt>(int
1b30: 29 77 72 6f 74 65 20 29 7b 0a 20 20 20 20 72 65  )wrote ){.    re
1b40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1b50: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1b60: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1b70: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 72 65 61 64  ** Move the read
1b80: 2f 77 72 69 74 65 20 70 6f 69 6e 74 65 72 20 69  /write pointer i
1b90: 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74  n a file..*/.int
1ba0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 4f   sqlite3OsSeek(O
1bb0: 73 46 69 6c 65 20 2a 69 64 2c 20 6f 66 66 5f 74  sFile *id, off_t
1bc0: 20 6f 66 66 73 65 74 29 7b 0a 20 20 4c 4f 4e 47   offset){.  LONG
1bd0: 20 75 70 70 65 72 42 69 74 73 20 3d 20 6f 66 66   upperBits = off
1be0: 73 65 74 3e 3e 33 32 3b 0a 20 20 4c 4f 4e 47 20  set>>32;.  LONG 
1bf0: 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 66 66 73  lowerBits = offs
1c00: 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 3b  et & 0xffffffff;
1c10: 0a 20 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 61  .  DWORD rc;.  a
1c20: 73 73 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65  ssert( id->isOpe
1c30: 6e 20 29 3b 0a 20 20 53 45 45 4b 28 6f 66 66 73  n );.  SEEK(offs
1c40: 65 74 2f 31 30 32 34 20 2b 20 31 29 3b 0a 20 20  et/1024 + 1);.  
1c50: 72 63 20 3d 20 53 65 74 46 69 6c 65 50 6f 69 6e  rc = SetFilePoin
1c60: 74 65 72 28 69 64 2d 3e 68 2c 20 6c 6f 77 65 72  ter(id->h, lower
1c70: 42 69 74 73 2c 20 26 75 70 70 65 72 42 69 74 73  Bits, &upperBits
1c80: 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20  , FILE_BEGIN);. 
1c90: 20 54 52 41 43 45 33 28 22 53 45 45 4b 20 25 64   TRACE3("SEEK %d
1ca0: 20 25 6c 6c 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c   %lld\n", id->h,
1cb0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 72 65 74 75   offset);.  retu
1cc0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1cd0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1ce0: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
1cf0: 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
1d00: 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
1d10: 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  o disk..*/.int s
1d20: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 4f 73 46  qlite3OsSync(OsF
1d30: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 61 73 73 65  ile *id){.  asse
1d40: 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29  rt( id->isOpen )
1d50: 3b 0a 20 20 54 52 41 43 45 33 28 22 53 59 4e 43  ;.  TRACE3("SYNC
1d60: 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20   %d lock=%d\n", 
1d70: 69 64 2d 3e 68 2c 20 69 64 2d 3e 6c 6f 63 6b 74  id->h, id->lockt
1d80: 79 70 65 29 3b 0a 20 20 69 66 28 20 46 6c 75 73  ype);.  if( Flus
1d90: 68 46 69 6c 65 42 75 66 66 65 72 73 28 69 64 2d  hFileBuffers(id-
1da0: 3e 68 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  >h) ){.    retur
1db0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1dc0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1dd0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
1de0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63   }.}../*.** Sync
1df0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 7a   the directory z
1e00: 44 69 72 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  Dirname. This is
1e10: 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 6f 70 65 72   a no-op on oper
1e20: 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6f 74  ating systems ot
1e30: 68 65 72 0a 2a 2a 20 74 68 61 6e 20 55 4e 49 58  her.** than UNIX
1e40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e50: 4f 73 53 79 6e 63 44 69 72 65 63 74 6f 72 79 28  OsSyncDirectory(
1e60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
1e70: 6e 61 6d 65 29 7b 0a 20 20 53 69 6d 75 6c 61 74  name){.  Simulat
1e80: 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  eIOError(SQLITE_
1e90: 49 4f 45 52 52 29 3b 0a 20 20 72 65 74 75 72 6e  IOERR);.  return
1ea0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1eb0: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e  *.** Truncate an
1ec0: 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20   open file to a 
1ed0: 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a  specified size.*
1ee0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 54  /.int sqlite3OsT
1ef0: 72 75 6e 63 61 74 65 28 4f 73 46 69 6c 65 20 2a  runcate(OsFile *
1f00: 69 64 2c 20 6f 66 66 5f 74 20 6e 42 79 74 65 29  id, off_t nByte)
1f10: 7b 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69  {.  LONG upperBi
1f20: 74 73 20 3d 20 6e 42 79 74 65 3e 3e 33 32 3b 0a  ts = nByte>>32;.
1f30: 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 69 73    assert( id->is
1f40: 4f 70 65 6e 20 29 3b 0a 20 20 54 52 41 43 45 33  Open );.  TRACE3
1f50: 28 22 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c  ("TRUNCATE %d %l
1f60: 6c 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 6e 42  ld\n", id->h, nB
1f70: 79 74 65 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  yte);.  Simulate
1f80: 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  IOError(SQLITE_I
1f90: 4f 45 52 52 29 3b 0a 20 20 53 65 74 46 69 6c 65  OERR);.  SetFile
1fa0: 50 6f 69 6e 74 65 72 28 69 64 2d 3e 68 2c 20 6e  Pointer(id->h, n
1fb0: 42 79 74 65 2c 20 26 75 70 70 65 72 42 69 74 73  Byte, &upperBits
1fc0: 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20  , FILE_BEGIN);. 
1fd0: 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 69 64   SetEndOfFile(id
1fe0: 2d 3e 68 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ->h);.  return S
1ff0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2000: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
2010: 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
2020: 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
2030: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
2040: 73 46 69 6c 65 53 69 7a 65 28 4f 73 46 69 6c 65  sFileSize(OsFile
2050: 20 2a 69 64 2c 20 6f 66 66 5f 74 20 2a 70 53 69   *id, off_t *pSi
2060: 7a 65 29 7b 0a 20 20 44 57 4f 52 44 20 75 70 70  ze){.  DWORD upp
2070: 65 72 42 69 74 73 2c 20 6c 6f 77 65 72 42 69 74  erBits, lowerBit
2080: 73 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d  s;.  assert( id-
2090: 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 53 69 6d  >isOpen );.  Sim
20a0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c  ulateIOError(SQL
20b0: 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 6c 6f  ITE_IOERR);.  lo
20c0: 77 65 72 42 69 74 73 20 3d 20 47 65 74 46 69 6c  werBits = GetFil
20d0: 65 53 69 7a 65 28 69 64 2d 3e 68 2c 20 26 75 70  eSize(id->h, &up
20e0: 70 65 72 42 69 74 73 29 3b 0a 20 20 2a 70 53 69  perBits);.  *pSi
20f0: 7a 65 20 3d 20 28 28 28 6f 66 66 5f 74 29 75 70  ze = (((off_t)up
2100: 70 65 72 42 69 74 73 29 3c 3c 33 32 29 20 2b 20  perBits)<<32) + 
2110: 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 72 65 74  lowerBits;.  ret
2120: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2130: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2140: 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69  rue (non-zero) i
2150: 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  f we are running
2160: 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69   under WinNT, Wi
2170: 6e 32 4b 20 6f 72 20 57 69 6e 58 50 2e 0a 2a 2a  n2K or WinXP..**
2180: 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a   Return false (z
2190: 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20  ero) for Win95, 
21a0: 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e  Win98, or WinME.
21b0: 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61  .**.** Here is a
21c0: 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62  n interesting ob
21d0: 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39  servation:  Win9
21e0: 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69  5, Win98, and Wi
21f0: 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20  nME lack.** the 
2200: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
2210: 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73 74  .  But we can st
2220: 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c  ill statically l
2230: 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74  ink against that
2240: 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20  .** API as long 
2250: 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c  as we don't call
2260: 20 69 74 20 77 69 6e 20 72 75 6e 6e 69 6e 67 20   it win running 
2270: 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20  Win95/98/ME.  A 
2280: 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20  call to.** this 
2290: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
22a0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
22b0: 74 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39  the host is Win9
22c0: 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69  5/98/ME or.** Wi
22d0: 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61  nNT/2K/XP so tha
22e0: 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77  t we will know w
22f0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65  hether or not we
2300: 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c   can safely call
2310: 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  .** the LockFile
2320: 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61  Ex() API..*/.sta
2330: 74 69 63 20 69 6e 74 20 69 73 4e 54 28 76 6f 69  tic int isNT(voi
2340: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  d){.  static int
2350: 20 6f 73 54 79 70 65 20 3d 20 30 3b 20 20 20 2f   osType = 0;   /
2360: 2a 20 30 3d 75 6e 6b 6e 6f 77 6e 20 31 3d 77 69  * 0=unknown 1=wi
2370: 6e 39 35 20 32 3d 77 69 6e 4e 54 20 2a 2f 0a 20  n95 2=winNT */. 
2380: 20 69 66 28 20 6f 73 54 79 70 65 3d 3d 30 20 29   if( osType==0 )
2390: 7b 0a 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49  {.    OSVERSIONI
23a0: 4e 46 4f 20 73 49 6e 66 6f 3b 0a 20 20 20 20 73  NFO sInfo;.    s
23b0: 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e  Info.dwOSVersion
23c0: 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f  InfoSize = sizeo
23d0: 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 47 65  f(sInfo);.    Ge
23e0: 74 56 65 72 73 69 6f 6e 45 78 28 26 73 49 6e 66  tVersionEx(&sInf
23f0: 6f 29 3b 0a 20 20 20 20 6f 73 54 79 70 65 20 3d  o);.    osType =
2400: 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72   sInfo.dwPlatfor
2410: 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f 52  mId==VER_PLATFOR
2420: 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20 3a  M_WIN32_NT ? 2 :
2430: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
2440: 20 6f 73 54 79 70 65 3d 3d 32 3b 0a 7d 0a 0a 2f   osType==2;.}../
2450: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72  *.** Acquire a r
2460: 65 61 64 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eader lock on th
2470: 65 20 72 61 6e 67 65 20 6f 66 20 62 79 74 65 73  e range of bytes
2480: 20 66 72 6f 6d 20 69 42 79 74 65 2e 2e 2e 69 42   from iByte...iB
2490: 79 74 65 2b 6e 42 79 74 65 2d 31 2e 0a 2a 2a 20  yte+nByte-1..** 
24a0: 44 69 66 66 65 72 65 6e 74 20 41 50 49 20 72 6f  Different API ro
24b0: 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c 6c 65  utines are calle
24c0: 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  d depending on w
24d0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
24e0: 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 35 20 6f  is.** is Win95 o
24f0: 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74  r WinNT..*/.stat
2500: 69 63 20 69 6e 74 20 67 65 74 52 65 61 64 4c 6f  ic int getReadLo
2510: 63 6b 28 48 41 4e 44 4c 45 20 68 2c 20 75 6e 73  ck(HANDLE h, uns
2520: 69 67 6e 65 64 20 69 6e 74 20 69 42 79 74 65 2c  igned int iByte,
2530: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 42   unsigned int nB
2540: 79 74 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b  yte){.  int res;
2550: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
2560: 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20  .    OVERLAPPED 
2570: 6f 76 6c 70 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f  ovlp;.    ovlp.O
2580: 66 66 73 65 74 20 3d 20 69 42 79 74 65 3b 0a 20  ffset = iByte;. 
2590: 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69     ovlp.OffsetHi
25a0: 67 68 20 3d 20 30 3b 0a 20 20 20 20 6f 76 6c 70  gh = 0;.    ovlp
25b0: 2e 68 45 76 65 6e 74 20 3d 20 30 3b 0a 20 20 20  .hEvent = 0;.   
25c0: 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 45   res = LockFileE
25d0: 78 28 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  x(h, LOCKFILE_FA
25e0: 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c 20  IL_IMMEDIATELY, 
25f0: 30 2c 20 6e 42 79 74 65 2c 20 30 2c 20 26 6f 76  0, nByte, 0, &ov
2600: 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lp);.  }else{.  
2610: 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65    res = LockFile
2620: 28 68 2c 20 69 42 79 74 65 2c 20 30 2c 20 6e 42  (h, iByte, 0, nB
2630: 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  yte, 0);.  }.  r
2640: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
2650: 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c  .** Undo a readl
2660: 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ock.*/.static in
2670: 74 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  t unlockReadLock
2680: 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20  (OsFile *id){.  
2690: 69 6e 74 20 72 65 73 3b 0a 20 20 69 66 28 20 69  int res;.  if( i
26a0: 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73  sNT() ){.    res
26b0: 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64   = UnlockFile(id
26c0: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
26d0: 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a  T, 0, SHARED_SIZ
26e0: 45 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  E, 0);.  }else{.
26f0: 20 20 20 20 72 65 73 20 3d 20 55 6e 6c 6f 63 6b      res = Unlock
2700: 46 69 6c 65 28 69 64 2d 3e 68 2c 20 53 48 41 52  File(id->h, SHAR
2710: 45 44 5f 46 49 52 53 54 20 2b 20 69 64 2d 3e 73  ED_FIRST + id->s
2720: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30  haredLockByte, 0
2730: 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 1, 0);.  }.  r
2740: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
2750: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
2760: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
2770: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
2780: 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
2790: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
27a0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
27b0: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
27c0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
27d0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
27e0: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
27f0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
2800: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
2810: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
2820: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
2830: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
2840: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
2850: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
2860: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
2870: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
2880: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
2890: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
28a0: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
28b0: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
28c0: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
28d0: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
28e0: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
28f0: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
2900: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
2910: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
2920: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
2930: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
2940: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
2950: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
2960: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
2970: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
2980: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
2990: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
29a0: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
29b0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
29c0: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
29d0: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
29e0: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
29f0: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
2a00: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2a10: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
2a20: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54  rease a lock.  T
2a30: 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
2a40: 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ck() routine.** 
2a50: 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73  erases all locks
2a60: 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74   at once and ret
2a70: 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74  urns us immediat
2a80: 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c  ely to locking l
2a90: 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73  evel 0..** It is
2aa0: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2ab0: 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   lower the locki
2ac0: 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65  ng level one ste
2ad0: 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f  p at a time.  Yo
2ae0: 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72  u.** must go str
2af0: 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67  aight to locking
2b00: 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 69 6e 74   level 0..*/.int
2b10: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 4f   sqlite3OsLock(O
2b20: 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  sFile *id, int l
2b30: 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
2b40: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2b50: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2b60: 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e  e from subroutin
2b70: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20  es */.  int res 
2b80: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 1;           /
2b90: 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20 77 69  * Result of a wi
2ba0: 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20  ndows lock call 
2bb0: 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b  */.  int newLock
2bc0: 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 53  type;       /* S
2bd0: 65 74 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20  et id->locktype 
2be0: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 62 65  to this value be
2bf0: 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
2c00: 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67    int gotPending
2c10: 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65  Lock = 0;/* True
2c20: 20 69 66 20 77 65 20 61 63 71 75 69 72 65 64 20   if we acquired 
2c30: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74  a PENDING lock t
2c40: 68 69 73 20 74 69 6d 65 20 2a 2f 0a 0a 20 20 61  his time */..  a
2c50: 73 73 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65  ssert( id->isOpe
2c60: 6e 20 29 3b 0a 20 20 54 52 41 43 45 35 28 22 4c  n );.  TRACE5("L
2c70: 4f 43 4b 20 25 64 20 25 64 20 77 61 73 20 25 64  OCK %d %d was %d
2c80: 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  (%d)\n",.       
2c90: 20 20 20 69 64 2d 3e 68 2c 20 6c 6f 63 6b 74 79     id->h, lockty
2ca0: 70 65 2c 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65  pe, id->locktype
2cb0: 2c 20 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  , id->sharedLock
2cc0: 42 79 74 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Byte);..  /* If 
2cd0: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
2ce0: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
2cf0: 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
2d00: 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
2d10: 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20    ** OsFile, do 
2d20: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
2d30: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
2d40: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
2d50: 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74   ** sqlite3OsEnt
2d60: 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
2d70: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
2d80: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 64 2d  ..  */.  if( id-
2d90: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74  >locktype>=lockt
2da0: 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ype ){.    retur
2db0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2dc0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
2dd0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
2de0: 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
2df0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2e00: 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f  id->locktype!=NO
2e10: 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70  _LOCK || locktyp
2e20: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
2e30: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
2e40: 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type!=PENDING_LO
2e50: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
2e60: 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56  locktype!=RESERV
2e70: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 69 64 2d 3e 6c  ED_LOCK || id->l
2e80: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
2e90: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  LOCK );..  /* Lo
2ea0: 63 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c  ck the PENDING_L
2eb0: 4f 43 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e  OCK byte if we n
2ec0: 65 65 64 20 74 6f 20 61 63 71 75 69 72 65 20 61  eed to acquire a
2ed0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72   PENDING lock or
2ee0: 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c  .  ** a SHARED l
2ef0: 6f 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20  ock.  If we are 
2f00: 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
2f10: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71  ED lock, the acq
2f20: 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a  uisition of.  **
2f30: 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
2f40: 4b 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72  K byte is tempor
2f50: 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c  ary..  */.  newL
2f60: 6f 63 6b 74 79 70 65 20 3d 20 69 64 2d 3e 6c 6f  ocktype = id->lo
2f70: 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 69 64  cktype;.  if( id
2f80: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
2f90: 4f 43 4b 0a 20 20 20 7c 7c 20 28 6c 6f 63 6b 74  OCK.   || (lockt
2fa0: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
2fb0: 4f 43 4b 20 26 26 20 69 64 2d 3e 6c 6f 63 6b 74  OCK && id->lockt
2fc0: 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype==RESERVED_LO
2fd0: 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  CK).  ){.    int
2fe0: 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68   cnt = 3;.    wh
2ff0: 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20  ile( cnt-->0 && 
3000: 28 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28  (res = LockFile(
3010: 69 64 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42  id->h, PENDING_B
3020: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d  YTE, 0, 1, 0))==
3030: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  0 ){.      /* Tr
3040: 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65 74  y 3 times to get
3050: 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63   the pending loc
3060: 6b 2e 20 20 54 68 65 20 70 65 6e 64 69 6e 67 20  k.  The pending 
3070: 6c 6f 63 6b 20 6d 69 67 68 74 20 62 65 0a 20 20  lock might be.  
3080: 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 61      ** held by a
3090: 6e 6f 74 68 65 72 20 72 65 61 64 65 72 20 70 72  nother reader pr
30a0: 6f 63 65 73 73 20 77 68 6f 20 77 69 6c 6c 20 72  ocess who will r
30b0: 65 6c 65 61 73 65 20 69 74 20 6d 6f 6d 65 6e 74  elease it moment
30c0: 61 72 69 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  arily..      */.
30d0: 20 20 20 20 20 20 54 52 41 43 45 32 28 22 63 6f        TRACE2("co
30e0: 75 6c 64 20 6e 6f 74 20 67 65 74 20 61 20 50 45  uld not get a PE
30f0: 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20 63 6e 74 3d  NDING lock. cnt=
3100: 25 64 5c 6e 22 2c 20 63 6e 74 29 3b 0a 20 20 20  %d\n", cnt);.   
3110: 20 20 20 53 6c 65 65 70 28 31 29 3b 0a 20 20 20     Sleep(1);.   
3120: 20 7d 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e   }.    gotPendin
3130: 67 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 7d  gLock = res;.  }
3140: 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
3150: 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a   shared lock.  *
3160: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
3170: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
3180: 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
3190: 72 74 28 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65  rt( id->locktype
31a0: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ==NO_LOCK );.   
31b0: 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
31c0: 20 20 20 20 20 72 65 73 20 3d 20 67 65 74 52 65       res = getRe
31d0: 61 64 4c 6f 63 6b 28 69 64 2d 3e 68 2c 20 53 48  adLock(id->h, SH
31e0: 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52  ARED_FIRST, SHAR
31f0: 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 65  ED_SIZE);.    }e
3200: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  lse{.      int l
3210: 6b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  k;.      sqlite3
3220: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
3230: 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20  f(lk), &lk);.   
3240: 20 20 20 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63     id->sharedLoc
3250: 6b 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 30 78  kByte = (lk & 0x
3260: 37 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45  7fffffff)%(SHARE
3270: 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20  D_SIZE - 1);.   
3280: 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c     res = LockFil
3290: 65 28 69 64 2d 3e 68 2c 20 53 48 41 52 45 44 5f  e(id->h, SHARED_
32a0: 46 49 52 53 54 2b 69 64 2d 3e 73 68 61 72 65 64  FIRST+id->shared
32b0: 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
32c0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
32d0: 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
32e0: 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ewLocktype = SHA
32f0: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  RED_LOCK;.    }.
3300: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
3310: 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
3320: 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
3330: 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
3340: 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
3350: 20 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 6c     assert( id->l
3360: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
3370: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
3380: 3d 20 4c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68  = LockFile(id->h
3390: 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
33a0: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69   0, 1, 0);.    i
33b0: 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
33c0: 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45  newLocktype = RE
33d0: 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SERVED_LOCK;.   
33e0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71   }.  }..  /* Acq
33f0: 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c  uire a PENDING l
3400: 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
3410: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
3420: 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  VE_LOCK && res )
3430: 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70  {.    newLocktyp
3440: 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  e = PENDING_LOCK
3450: 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67  ;.    gotPending
3460: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Lock = 0;.  }.. 
3470: 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45   /* Acquire an E
3480: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20  XCLUSIVE lock.  
3490: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
34a0: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
34b0: 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
34c0: 61 73 73 65 72 74 28 20 69 64 2d 3e 6c 6f 63 6b  assert( id->lock
34d0: 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  type>=SHARED_LOC
34e0: 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 75  K );.    res = u
34f0: 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 69 64  nlockReadLock(id
3500: 29 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22 75  );.    TRACE2("u
3510: 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e  nreadlock = %d\n
3520: 22 2c 20 72 65 73 29 3b 0a 20 20 20 20 72 65 73  ", res);.    res
3530: 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e   = LockFile(id->
3540: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
3550: 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c   0, SHARED_SIZE,
3560: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
3570: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
3580: 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56  ktype = EXCLUSIV
3590: 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  E_LOCK;.    }els
35a0: 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45 32 28  e{.      TRACE2(
35b0: 22 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64  "error-code = %d
35c0: 5c 6e 22 2c 20 47 65 74 4c 61 73 74 45 72 72 6f  \n", GetLastErro
35d0: 72 28 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  r());.    }.  }.
35e0: 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
35f0: 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e  holding a PENDIN
3600: 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68  G lock that ough
3610: 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64  t to be released
3620: 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65  , then.  ** rele
3630: 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f  ase it now..  */
3640: 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e  .  if( gotPendin
3650: 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70  gLock && locktyp
3660: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
3670: 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65  {.    UnlockFile
3680: 28 69 64 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  (id->h, PENDING_
3690: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
36a0: 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
36b0: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
36c0: 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64 20  e lock has held 
36d0: 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  in the file desc
36e0: 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a  riptor then.  **
36f0: 20 72 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   return the appr
3700: 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74 20 63  opriate result c
3710: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ode..  */.  if( 
3720: 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  res ){.    rc = 
3730: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
3740: 73 65 7b 0a 20 20 20 20 54 52 41 43 45 34 28 22  se{.    TRACE4("
3750: 4c 4f 43 4b 20 46 41 49 4c 45 44 20 25 64 20 74  LOCK FAILED %d t
3760: 72 79 69 6e 67 20 66 6f 72 20 25 64 20 62 75 74  rying for %d but
3770: 20 67 6f 74 20 25 64 5c 6e 22 2c 20 69 64 2d 3e   got %d\n", id->
3780: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f  h,.           lo
3790: 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74  cktype, newLockt
37a0: 79 70 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ype);.    rc = S
37b0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
37c0: 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d    id->locktype =
37d0: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20   newLocktype;.  
37e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
37f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3800: 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
3810: 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
3820: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
3830: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
3840: 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
3850: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
3860: 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
3870: 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a  s held, return.*
3880: 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65  * non-zero, othe
3890: 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 69  rwise zero..*/.i
38a0: 6e 74 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63  nt sqlite3OsChec
38b0: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73  kReservedLock(Os
38c0: 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  File *id){.  int
38d0: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69   rc;.  assert( i
38e0: 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 69  d->isOpen );.  i
38f0: 66 28 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3e  f( id->locktype>
3900: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
3910: 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
3920: 20 20 54 52 41 43 45 33 28 22 54 45 53 54 20 57    TRACE3("TEST W
3930: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 6c 6f  R-LOCK %d %d (lo
3940: 63 61 6c 29 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  cal)\n", id->h, 
3950: 72 63 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rc);.  }else{.  
3960: 20 20 72 63 20 3d 20 4c 6f 63 6b 46 69 6c 65 28    rc = LockFile(
3970: 69 64 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f  id->h, RESERVED_
3980: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
3990: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
39a0: 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69      UnlockFile(i
39b0: 64 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  d->h, RESERVED_B
39c0: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
39d0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72     }.    rc = !r
39e0: 63 3b 0a 20 20 20 20 54 52 41 43 45 33 28 22 54  c;.    TRACE3("T
39f0: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
3a00: 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 69  d (remote)\n", i
3a10: 64 2d 3e 68 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  d->h, rc);.  }. 
3a20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
3a30: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
3a40: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
3a50: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
3a60: 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  id to locktype. 
3a70: 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
3a80: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
3a90: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
3aa0: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
3ab0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
3ac0: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
3ad0: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
3ae0: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
3af0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
3b00: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
3b10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
3b20: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  o-op..**.** It i
3b30: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
3b40: 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
3b50: 74 6f 20 66 61 69 6c 2e 0a 2a 2f 0a 69 6e 74 20  to fail..*/.int 
3b60: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
3b70: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  OsFile *id, int 
3b80: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
3b90: 20 72 63 2c 20 74 79 70 65 3b 0a 20 20 61 73 73   rc, type;.  ass
3ba0: 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20  ert( id->isOpen 
3bb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
3bc0: 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f  ktype<=SHARED_LO
3bd0: 43 4b 20 29 3b 0a 20 20 54 52 41 43 45 35 28 22  CK );.  TRACE5("
3be0: 55 4e 4c 4f 43 4b 20 25 64 20 74 6f 20 25 64 20  UNLOCK %d to %d 
3bf0: 77 61 73 20 25 64 28 25 64 29 5c 6e 22 2c 20 69  was %d(%d)\n", i
3c00: 64 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a  d->h, locktype,.
3c10: 20 20 20 20 20 20 20 20 20 20 69 64 2d 3e 6c 6f            id->lo
3c20: 63 6b 74 79 70 65 2c 20 69 64 2d 3e 73 68 61 72  cktype, id->shar
3c30: 65 64 4c 6f 63 6b 42 79 74 65 29 3b 0a 20 20 74  edLockByte);.  t
3c40: 79 70 65 20 3d 20 69 64 2d 3e 6c 6f 63 6b 74 79  ype = id->lockty
3c50: 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d  pe;.  if( type>=
3c60: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
3c70: 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65  {.    UnlockFile
3c80: 28 69 64 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  (id->h, SHARED_F
3c90: 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f  IRST, 0, SHARED_
3ca0: 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  SIZE, 0);.  }.  
3cb0: 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45 52 56  if( type>=RESERV
3cc0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55  ED_LOCK ){.    U
3cd0: 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c  nlockFile(id->h,
3ce0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
3cf0: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 1, 0);.  }.  
3d00: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
3d10: 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53  _LOCK && type>=S
3d20: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 74 79  HARED_LOCK && ty
3d30: 70 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  pe<EXCLUSIVE_LOC
3d40: 4b 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 52  K ){.    unlockR
3d50: 65 61 64 4c 6f 63 6b 28 69 64 29 3b 0a 20 20 7d  eadLock(id);.  }
3d60: 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e  .  if( type>=PEN
3d70: 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  DING_LOCK ){.   
3d80: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e   UnlockFile(id->
3d90: 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
3da0: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 1, 0);.  }. 
3db0: 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20   id->locktype = 
3dc0: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75  locktype;.  retu
3dd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
3de0: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 69 6e 66 6f 72  ./*.** Get infor
3df0: 6d 61 74 69 6f 6e 20 74 6f 20 73 65 65 64 20 74  mation to seed t
3e00: 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  he random number
3e10: 20 67 65 6e 65 72 61 74 6f 72 2e 20 20 54 68 65   generator.  The
3e20: 20 73 65 65 64 0a 2a 2a 20 69 73 20 77 72 69 74   seed.** is writ
3e30: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ten into the buf
3e40: 66 65 72 20 7a 42 75 66 5b 32 35 36 5d 2e 20 20  fer zBuf[256].  
3e50: 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
3e60: 74 69 6f 6e 20 6d 75 73 74 0a 2a 2a 20 73 75 70  tion must.** sup
3e70: 70 6c 79 20 61 20 73 75 66 66 69 63 69 65 6e 74  ply a sufficient
3e80: 6c 79 20 6c 61 72 67 65 20 62 75 66 66 65 72 2e  ly large buffer.
3e90: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
3ea0: 73 52 61 6e 64 6f 6d 53 65 65 64 28 63 68 61 72  sRandomSeed(char
3eb0: 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 57 65   *zBuf){.  /* We
3ec0: 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c   have to initial
3ed0: 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76  ize zBuf to prev
3ee0: 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f  ent valgrind fro
3ef0: 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a  m reporting.  **
3f00: 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65   errors.  The re
3f10: 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20  ports issued by 
3f20: 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63  valgrind are inc
3f30: 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c  orrect - we woul
3f40: 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68  d.  ** prefer th
3f50: 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  at the randomnes
3f60: 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62  s be increased b
3f70: 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20  y making use of 
3f80: 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69  the.  ** uniniti
3f90: 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20  alized space in 
3fa0: 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72  zBuf - but valgr
3fb0: 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20  ind errors tend 
3fc0: 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f  to worry.  ** so
3fd0: 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65  me users.  Rathe
3fe0: 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74  r than argue, it
3ff0: 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75   seems easier ju
4000: 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  st to initialize
4010: 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20  .  ** the whole 
4020: 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63  array and silenc
4030: 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e  e valgrind, even
4040: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c   if that means l
4050: 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20  ess randomness. 
4060: 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f   ** in the rando
4070: 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  m seed..  **.  *
4080: 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20  * When testing, 
4090: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75  initializing zBu
40a0: 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61  f[] to zero is a
40b0: 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20  ll we do.  That 
40c0: 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
40d0: 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
40e0: 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75  e same random nu
40f0: 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 2a 20  mber sequence.* 
4100: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20  This makes the. 
4110: 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74   ** tests repeat
4120: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  able..  */.  mem
4130: 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 32 35 36  set(zBuf, 0, 256
4140: 29 3b 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69  );.  GetSystemTi
4150: 6d 65 28 28 4c 50 53 59 53 54 45 4d 54 49 4d 45  me((LPSYSTEMTIME
4160: 29 7a 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e  )zBuf);.  return
4170: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4180: 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
4190: 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
41a0: 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
41b0: 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
41c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
41d0: 73 53 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a  sSleep(int ms){.
41e0: 20 20 53 6c 65 65 70 28 6d 73 29 3b 0a 20 20 72    Sleep(ms);.  r
41f0: 65 74 75 72 6e 20 6d 73 3b 0a 7d 0a 0a 2f 2a 0a  eturn ms;.}../*.
4200: 2a 2a 20 53 74 61 74 69 63 20 76 61 72 69 61 62  ** Static variab
4210: 6c 65 73 20 75 73 65 64 20 66 6f 72 20 74 68 72  les used for thr
4220: 65 61 64 20 73 79 6e 63 68 72 6f 6e 69 7a 61 74  ead synchronizat
4230: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
4240: 74 20 69 6e 4d 75 74 65 78 20 3d 20 30 3b 0a 23  t inMutex = 0;.#
4250: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 33 32  ifdef SQLITE_W32
4260: 5f 54 48 52 45 41 44 53 0a 20 20 73 74 61 74 69  _THREADS.  stati
4270: 63 20 43 52 49 54 49 43 41 4c 5f 53 45 43 54 49  c CRITICAL_SECTI
4280: 4f 4e 20 63 73 3b 0a 23 65 6e 64 69 66 0a 0a 2f  ON cs;.#endif../
4290: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
42a0: 6e 67 20 70 61 69 72 20 6f 66 20 72 6f 75 74 69  ng pair of routi
42b0: 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 75 74  ne implement mut
42c0: 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 20 66 6f  ual exclusion fo
42d0: 72 0a 2a 2a 20 6d 75 6c 74 69 2d 74 68 72 65 61  r.** multi-threa
42e0: 64 65 64 20 70 72 6f 63 65 73 73 65 73 2e 20 20  ded processes.  
42f0: 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 68  Only a single th
4300: 72 65 61 64 20 69 73 20 61 6c 6c 6f 77 65 64 20  read is allowed 
4310: 74 6f 0a 2a 2a 20 65 78 65 63 75 74 65 64 20 63  to.** executed c
4320: 6f 64 65 20 74 68 61 74 20 69 73 20 73 75 72 72  ode that is surr
4330: 6f 75 6e 64 65 64 20 62 79 20 45 6e 74 65 72 4d  ounded by EnterM
4340: 75 74 65 78 28 29 20 61 6e 64 20 4c 65 61 76 65  utex() and Leave
4350: 4d 75 74 65 78 28 29 2e 0a 2a 2a 0a 2a 2a 20 53  Mutex()..**.** S
4360: 51 4c 69 74 65 20 75 73 65 73 20 6f 6e 6c 79 20  QLite uses only 
4370: 61 20 73 69 6e 67 6c 65 20 4d 75 74 65 78 2e 20  a single Mutex. 
4380: 20 54 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   There is not mu
4390: 63 68 20 63 72 69 74 69 63 61 6c 0a 2a 2a 20 63  ch critical.** c
43a0: 6f 64 65 20 61 6e 64 20 77 68 61 74 20 6c 69 74  ode and what lit
43b0: 74 6c 65 20 74 68 65 72 65 20 69 73 20 65 78 65  tle there is exe
43c0: 63 75 74 65 73 20 71 75 69 63 6b 6c 79 20 61 6e  cutes quickly an
43d0: 64 20 77 69 74 68 6f 75 74 20 62 6c 6f 63 6b 69  d without blocki
43e0: 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ng..*/.void sqli
43f0: 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
4400: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
4410: 5f 57 33 32 5f 54 48 52 45 41 44 53 0a 20 20 73  _W32_THREADS.  s
4420: 74 61 74 69 63 20 69 6e 74 20 69 73 49 6e 69 74  tatic int isInit
4430: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 21   = 0;.  while( !
4440: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 74  isInit ){.    st
4450: 61 74 69 63 20 6c 6f 6e 67 20 6c 6f 63 6b 20 3d  atic long lock =
4460: 20 30 3b 0a 20 20 20 20 69 66 28 20 49 6e 74 65   0;.    if( Inte
4470: 72 6c 6f 63 6b 65 64 49 6e 63 72 65 6d 65 6e 74  rlockedIncrement
4480: 28 26 6c 6f 63 6b 29 3d 3d 31 20 29 7b 0a 20 20  (&lock)==1 ){.  
4490: 20 20 20 20 49 6e 69 74 69 61 6c 69 7a 65 43 72      InitializeCr
44a0: 69 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 63  iticalSection(&c
44b0: 73 29 3b 0a 20 20 20 20 20 20 69 73 49 6e 69 74  s);.      isInit
44c0: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
44d0: 0a 20 20 20 20 20 20 53 6c 65 65 70 28 31 29 3b  .      Sleep(1);
44e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 45 6e 74  .    }.  }.  Ent
44f0: 65 72 43 72 69 74 69 63 61 6c 53 65 63 74 69 6f  erCriticalSectio
4500: 6e 28 26 63 73 29 3b 0a 23 65 6e 64 69 66 0a 20  n(&cs);.#endif. 
4510: 20 61 73 73 65 72 74 28 20 21 69 6e 4d 75 74 65   assert( !inMute
4520: 78 20 29 3b 0a 20 20 69 6e 4d 75 74 65 78 20 3d  x );.  inMutex =
4530: 20 31 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74   1;.}.void sqlit
4540: 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29  e3OsLeaveMutex()
4550: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 4d 75  {.  assert( inMu
4560: 74 65 78 20 29 3b 0a 20 20 69 6e 4d 75 74 65 78  tex );.  inMutex
4570: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
4580: 49 54 45 5f 57 33 32 5f 54 48 52 45 41 44 53 0a  ITE_W32_THREADS.
4590: 20 20 4c 65 61 76 65 43 72 69 74 69 63 61 6c 53    LeaveCriticalS
45a0: 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a 23 65 6e  ection(&cs);.#en
45b0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  dif.}../*.** Tur
45c0: 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
45d0: 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
45e0: 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74  l pathname.  Ret
45f0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
4600: 20 74 6f 20 74 68 65 20 66 75 6c 6c 20 70 61 74   to the full pat
4610: 68 6e 61 6d 65 20 73 74 6f 72 65 64 20 69 6e 20  hname stored in 
4620: 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
4630: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
4640: 28 29 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  ()..** The calli
4650: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ng function is r
4660: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66  esponsible for f
4670: 72 65 65 69 6e 67 20 74 68 69 73 20 73 70 61 63  reeing this spac
4680: 65 20 6f 6e 63 65 20 69 74 0a 2a 2a 20 69 73 20  e once it.** is 
4690: 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 65 64 65 64  no longer needed
46a0: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
46b0: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
46c0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65  (const char *zRe
46d0: 6c 61 74 69 76 65 29 7b 0a 20 20 63 68 61 72 20  lative){.  char 
46e0: 2a 7a 4e 6f 74 55 73 65 64 3b 0a 20 20 63 68 61  *zNotUsed;.  cha
46f0: 72 20 2a 7a 46 75 6c 6c 3b 0a 20 20 69 6e 74 20  r *zFull;.  int 
4700: 6e 42 79 74 65 3b 0a 20 20 6e 42 79 74 65 20 3d  nByte;.  nByte =
4710: 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65   GetFullPathName
4720: 28 7a 52 65 6c 61 74 69 76 65 2c 20 30 2c 20 30  (zRelative, 0, 0
4730: 2c 20 26 7a 4e 6f 74 55 73 65 64 29 20 2b 20 31  , &zNotUsed) + 1
4740: 3b 0a 20 20 7a 46 75 6c 6c 20 3d 20 73 71 6c 69  ;.  zFull = sqli
4750: 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  teMalloc( nByte 
4760: 29 3b 0a 20 20 69 66 28 20 7a 46 75 6c 6c 3d 3d  );.  if( zFull==
4770: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4780: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 28  GetFullPathName(
4790: 7a 52 65 6c 61 74 69 76 65 2c 20 6e 42 79 74 65  zRelative, nByte
47a0: 2c 20 7a 46 75 6c 6c 2c 20 26 7a 4e 6f 74 55 73  , zFull, &zNotUs
47b0: 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46  ed);.  return zF
47c0: 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ull;.}../*.** Th
47d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
47e0: 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20  able, if set to 
47f0: 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
4800: 2c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65  , becomes the re
4810: 73 75 6c 74 0a 2a 2a 20 72 65 74 75 72 6e 65 64  sult.** returned
4820: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 43   from sqlite3OsC
4830: 75 72 72 65 6e 74 54 69 6d 65 28 29 2e 20 20 54  urrentTime().  T
4840: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
4850: 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64  testing..*/.#ifd
4860: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
4870: 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
4880: 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 0a 23 65 6e  nt_time = 0;.#en
4890: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
48a0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
48b0: 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
48c0: 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
48d0: 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
48e0: 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
48f0: 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
4900: 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74  n Day number int
4910: 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20  o *prNow and.** 
4920: 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72  return 0.  Retur
4930: 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20  n 1 if the time 
4940: 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20  and date cannot 
4950: 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  be found..*/.int
4960: 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
4970: 74 54 69 6d 65 28 64 6f 75 62 6c 65 20 2a 70 72  tTime(double *pr
4980: 4e 6f 77 29 7b 0a 20 20 46 49 4c 45 54 49 4d 45  Now){.  FILETIME
4990: 20 66 74 3b 0a 20 20 2f 2a 20 46 49 4c 45 54 49   ft;.  /* FILETI
49a0: 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ME structure is 
49b0: 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72  a 64-bit value r
49c0: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
49d0: 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 20  number of .     
49e0: 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69  100-nanosecond i
49f0: 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a  ntervals since J
4a00: 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20 28  anuary 1, 1601 (
4a10: 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e  = JD 2305813.5).
4a20: 20 0a 20 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20   .  */.  double 
4a30: 6e 6f 77 3b 0a 20 20 47 65 74 53 79 73 74 65 6d  now;.  GetSystem
4a40: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20  TimeAsFileTime( 
4a50: 26 66 74 20 29 3b 0a 20 20 6e 6f 77 20 3d 20 28  &ft );.  now = (
4a60: 28 64 6f 75 62 6c 65 29 66 74 2e 64 77 48 69 67  (double)ft.dwHig
4a70: 68 44 61 74 65 54 69 6d 65 29 20 2a 20 34 32 39  hDateTime) * 429
4a80: 34 39 36 37 32 39 36 2e 30 3b 20 0a 20 20 2a 70  4967296.0; .  *p
4a90: 72 4e 6f 77 20 3d 20 28 6e 6f 77 20 2b 20 66 74  rNow = (now + ft
4aa0: 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f  .dwLowDateTime)/
4ab0: 38 36 34 30 30 30 30 30 30 30 30 30 2e 30 20 2b  864000000000.0 +
4ac0: 20 32 33 30 35 38 31 33 2e 35 3b 0a 23 69 66 64   2305813.5;.#ifd
4ad0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
4ae0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72   if( sqlite3_cur
4af0: 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20  rent_time ){.   
4b00: 20 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69 74 65   *prNow = sqlite
4b10: 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2f 38  3_current_time/8
4b20: 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37  6400.0 + 2440587
4b30: 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  .5;.  }.#endif. 
4b40: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
4b50: 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 69 6d  .** Find the tim
4b60: 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  e that the file 
4b70: 77 61 73 20 6c 61 73 74 20 6d 6f 64 69 66 69 65  was last modifie
4b80: 64 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  d.  Write the.**
4b90: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 74 69   modification ti
4ba0: 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
4bb0: 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
4bc0: 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
4bd0: 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  nd.** return SQL
4be0: 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20  ITE_OK.  Return 
4bf0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
4c00: 74 68 65 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  the modification
4c10: 0a 2a 2a 20 74 69 6d 65 20 63 61 6e 6e 6f 74 20  .** time cannot 
4c20: 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  be found..*/.int
4c30: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 4d 6f   sqlite3OsFileMo
4c40: 64 54 69 6d 65 28 4f 73 46 69 6c 65 20 2a 69 64  dTime(OsFile *id
4c50: 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4d 54 69 6d  , double *prMTim
4c60: 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
4c70: 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 2f  FILETIME ft;.  /
4c80: 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63  * FILETIME struc
4c90: 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69 74  ture is a 64-bit
4ca0: 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74   value represent
4cb0: 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
4cc0: 66 20 0a 20 20 2a 2a 20 31 30 30 2d 6e 61 6e 6f  f .  ** 100-nano
4cd0: 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73  second intervals
4ce0: 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31   since January 1
4cf0: 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30  , 1601 (= JD 230
4d00: 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20  5813.5). .  */. 
4d10: 20 69 66 28 20 47 65 74 46 69 6c 65 54 69 6d 65   if( GetFileTime
4d20: 28 69 64 2d 3e 68 2c 20 30 2c 20 30 2c 20 26 66  (id->h, 0, 0, &f
4d30: 74 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65  t) ){.    double
4d40: 20 74 3b 0a 20 20 20 20 74 20 3d 20 28 28 64 6f   t;.    t = ((do
4d50: 75 62 6c 65 29 66 74 2e 64 77 48 69 67 68 44 61  uble)ft.dwHighDa
4d60: 74 65 54 69 6d 65 29 20 2a 20 34 32 39 34 39 36  teTime) * 429496
4d70: 37 32 39 36 2e 30 3b 20 0a 20 20 20 20 2a 70 72  7296.0; .    *pr
4d80: 4d 54 69 6d 65 20 3d 20 28 74 20 2b 20 66 74 2e  MTime = (t + ft.
4d90: 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 38  dwLowDateTime)/8
4da0: 36 34 30 30 30 30 30 30 30 30 30 2e 30 20 2b 20  64000000000.0 + 
4db0: 32 33 30 35 38 31 33 2e 35 3b 0a 20 20 20 20 72  2305813.5;.    r
4dc0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
4dd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
4de0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
4df0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4e00: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  }..#endif /* OS_
4e10: 57 49 4e 20 2a 2f 0a                             WIN */.