/ Hex Artifact Content
Login

Artifact 4a75888ba3dfc820ad5e8177025972d74d7f2440:


0000: 2f 2a 0a 2a 2a 20 32 30 30 36 20 46 65 62 20 31  /*.** 2006 Feb 1
0010: 34 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  4.**.** 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 4f 53 2f 32 2e 0a 2a 2f  ific to OS/2..*/
01b0: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  ..#include "sqli
01c0: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 20 53 51  teInt.h"..#if SQ
01d0: 4c 49 54 45 5f 4f 53 5f 4f 53 32 0a 0a 2f 2a 0a  LITE_OS_OS2../*.
01e0: 2a 2a 20 41 20 4e 6f 74 65 20 41 62 6f 75 74 20  ** A Note About 
01f0: 4d 65 6d 6f 72 79 20 41 6c 6c 6f 63 61 74 69 6f  Memory Allocatio
0200: 6e 3a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 72  n:.**.** This dr
0210: 69 76 65 72 20 75 73 65 73 20 6d 61 6c 6c 6f 63  iver uses malloc
0220: 28 29 2f 66 72 65 65 28 29 20 64 69 72 65 63 74  ()/free() direct
0230: 6c 79 20 72 61 74 68 65 72 20 74 68 61 6e 20 67  ly rather than g
0240: 6f 69 6e 67 20 74 68 72 6f 75 67 68 0a 2a 2a 20  oing through.** 
0250: 74 68 65 20 53 51 4c 69 74 65 2d 77 72 61 70 70  the SQLite-wrapp
0260: 65 72 73 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  ers sqlite3_mall
0270: 6f 63 28 29 2f 73 71 6c 69 74 65 33 5f 66 72 65  oc()/sqlite3_fre
0280: 65 28 29 2e 20 20 54 68 6f 73 65 20 77 72 61 70  e().  Those wrap
0290: 70 65 72 73 0a 2a 2a 20 61 72 65 20 64 65 73 69  pers.** are desi
02a0: 67 6e 65 64 20 66 6f 72 20 75 73 65 20 6f 6e 20  gned for use on 
02b0: 65 6d 62 65 64 64 65 64 20 73 79 73 74 65 6d 73  embedded systems
02c0: 20 77 68 65 72 65 20 6d 65 6d 6f 72 79 20 69 73   where memory is
02d0: 20 73 63 61 72 63 65 20 61 6e 64 0a 2a 2a 20 6d   scarce and.** m
02e0: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 68  alloc failures h
02f0: 61 70 70 65 6e 20 66 72 65 71 75 65 6e 74 6c 79  appen frequently
0300: 2e 20 20 4f 53 2f 32 20 64 6f 65 73 20 6e 6f 74  .  OS/2 does not
0310: 20 74 79 70 69 63 61 6c 6c 79 20 72 75 6e 20 6f   typically run o
0320: 6e 0a 2a 2a 20 65 6d 62 65 64 64 65 64 20 73 79  n.** embedded sy
0330: 73 74 65 6d 73 2c 20 61 6e 64 20 77 68 65 6e 20  stems, and when 
0340: 69 74 20 64 6f 65 73 20 74 68 65 20 64 65 76 65  it does the deve
0350: 6c 6f 70 65 72 73 20 6e 6f 72 6d 61 6c 6c 79 20  lopers normally 
0360: 68 61 76 65 20 62 69 67 67 65 72 0a 2a 2a 20 70  have bigger.** p
0370: 72 6f 62 6c 65 6d 73 20 74 6f 20 77 6f 72 72 79  roblems to worry
0380: 20 61 62 6f 75 74 20 74 68 61 6e 20 72 75 6e 6e   about than runn
0390: 69 6e 67 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  ing out of memor
03a0: 79 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73 20  y.  So there is 
03b0: 6e 6f 74 0a 2a 2a 20 61 20 63 6f 6d 70 65 6c 6c  not.** a compell
03c0: 69 6e 67 20 6e 65 65 64 20 74 6f 20 75 73 65 20  ing need to use 
03d0: 74 68 65 20 77 72 61 70 70 65 72 73 2e 0a 2a 2a  the wrappers..**
03e0: 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69 73  .** But there is
03f0: 20 61 20 67 6f 6f 64 20 72 65 61 73 6f 6e 20 74   a good reason t
0400: 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 77 72  o not use the wr
0410: 61 70 70 65 72 73 2e 20 20 49 66 20 77 65 20 75  appers.  If we u
0420: 73 65 20 74 68 65 0a 2a 2a 20 77 72 61 70 70 65  se the.** wrappe
0430: 72 73 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  rs then we will 
0440: 67 65 74 20 73 69 6d 75 6c 61 74 65 64 20 6d 61  get simulated ma
0450: 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20  lloc() failures 
0460: 77 69 74 68 69 6e 20 74 68 69 73 0a 2a 2a 20 64  within this.** d
0470: 72 69 76 65 72 2e 20 20 41 6e 64 20 74 68 61 74  river.  And that
0480: 20 63 61 75 73 65 73 20 61 6c 6c 20 6b 69 6e 64   causes all kind
0490: 73 20 6f 66 20 70 72 6f 62 6c 65 6d 73 20 66 6f  s of problems fo
04a0: 72 20 6f 75 72 20 74 65 73 74 73 2e 20 20 57 65  r our tests.  We
04b0: 0a 2a 2a 20 63 6f 75 6c 64 20 65 6e 68 61 6e 63  .** could enhanc
04c0: 65 20 53 51 4c 69 74 65 20 74 6f 20 64 65 61 6c  e SQLite to deal
04d0: 20 77 69 74 68 20 73 69 6d 75 6c 61 74 65 64 20   with simulated 
04e0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20  malloc failures 
04f0: 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 4f 53  within.** the OS
0500: 20 64 72 69 76 65 72 2c 20 62 75 74 20 74 68 65   driver, but the
0510: 20 63 6f 64 65 20 74 6f 20 64 65 61 6c 20 77 69   code to deal wi
0520: 74 68 20 74 68 6f 73 65 20 66 61 69 6c 75 72 65  th those failure
0530: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65   would not.** be
0540: 20 65 78 65 72 63 69 73 65 64 20 6f 6e 20 4c 69   exercised on Li
0550: 6e 75 78 20 28 77 68 69 63 68 20 64 6f 65 73 20  nux (which does 
0560: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6c 6c  not need to mall
0570: 6f 63 28 29 20 69 6e 20 74 68 65 20 64 72 69 76  oc() in the driv
0580: 65 72 29 0a 2a 2a 20 61 6e 64 20 73 6f 20 77 65  er).** and so we
0590: 20 77 6f 75 6c 64 20 68 61 76 65 20 64 69 66 66   would have diff
05a0: 69 63 75 6c 74 79 20 77 72 69 74 69 6e 67 20 63  iculty writing c
05b0: 6f 76 65 72 61 67 65 20 74 65 73 74 73 20 66 6f  overage tests fo
05c0: 72 20 74 68 61 74 0a 2a 2a 20 63 6f 64 65 2e 20  r that.** code. 
05d0: 20 42 65 74 74 65 72 20 74 6f 20 6c 65 61 76 65   Better to leave
05e0: 20 74 68 65 20 63 6f 64 65 20 6f 75 74 2c 20 77   the code out, w
05f0: 65 20 74 68 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 54  e think..**.** T
0600: 68 65 20 70 6f 69 6e 74 20 6f 66 20 74 68 69 73  he point of this
0610: 20 64 69 73 63 75 73 73 69 6f 6e 20 69 73 20 61   discussion is a
0620: 73 20 66 6f 6c 6c 6f 77 73 3a 20 20 57 68 65 6e  s follows:  When
0630: 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 0a   creating a new.
0640: 2a 2a 20 4f 53 20 6c 61 79 65 72 20 66 6f 72 20  ** OS layer for 
0650: 61 6e 20 65 6d 62 65 64 64 65 64 20 73 79 73 74  an embedded syst
0660: 65 6d 2c 20 69 66 20 79 6f 75 20 75 73 65 20 74  em, if you use t
0670: 68 69 73 20 66 69 6c 65 20 61 73 20 61 6e 20 65  his file as an e
0680: 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 76 6f 69 64  xample,.** avoid
0690: 20 74 68 65 20 75 73 65 20 6f 66 20 6d 61 6c 6c   the use of mall
06a0: 6f 63 28 29 2f 66 72 65 65 28 29 2e 20 20 54 68  oc()/free().  Th
06b0: 6f 73 65 20 72 6f 75 74 69 6e 65 73 20 77 6f 72  ose routines wor
06c0: 6b 20 6f 6b 20 6f 6e 20 4f 53 2f 32 0a 2a 2a 20  k ok on OS/2.** 
06d0: 64 65 73 6b 74 6f 70 73 20 62 75 74 20 6e 6f 74  desktops but not
06e0: 20 73 6f 20 77 65 6c 6c 20 69 6e 20 65 6d 62 65   so well in embe
06f0: 64 64 65 64 20 73 79 73 74 65 6d 73 2e 0a 2a 2f  dded systems..*/
0700: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 75  ../*.** Macros u
0710: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
0720: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
0730: 74 6f 20 75 73 65 20 74 68 72 65 61 64 73 2e 0a  to use threads..
0740: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
0750: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
0760: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
0770: 41 44 53 41 46 45 0a 23 20 64 65 66 69 6e 65 20  ADSAFE.# define 
0780: 53 51 4c 49 54 45 5f 4f 53 32 5f 54 48 52 45 41  SQLITE_OS2_THREA
0790: 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  DS 1.#endif../*.
07a0: 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20  ** Include code 
07b0: 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  that is common t
07c0: 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c  o all os_*.c fil
07d0: 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  es.*/.#include "
07e0: 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a  os_common.h"../*
07f0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
0800: 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ces */.typedef s
0810: 74 72 75 63 74 20 6f 73 32 46 69 6c 65 20 6f 73  truct os2File os
0820: 32 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f  2File;         /
0830: 2a 20 54 68 65 20 66 69 6c 65 20 73 74 72 75 63  * The file struc
0840: 74 75 72 65 20 2a 2f 0a 74 79 70 65 64 65 66 20  ture */.typedef 
0850: 73 74 72 75 63 74 20 6f 73 32 53 68 6d 4e 6f 64  struct os2ShmNod
0860: 65 20 6f 73 32 53 68 6d 4e 6f 64 65 3b 20 20 20  e os2ShmNode;   
0870: 2f 2a 20 41 20 73 68 61 72 65 64 20 64 65 73 63  /* A shared desc
0880: 72 69 74 69 76 65 20 6d 65 6d 6f 72 79 20 6e 6f  ritive memory no
0890: 64 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  de */.typedef st
08a0: 72 75 63 74 20 6f 73 32 53 68 6d 4c 69 6e 6b 20  ruct os2ShmLink 
08b0: 6f 73 32 53 68 6d 4c 69 6e 6b 3b 20 20 20 2f 2a  os2ShmLink;   /*
08c0: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   A connection to
08d0: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a   shared-memory *
08e0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6f 73 32  /../*.** The os2
08f0: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  File structure i
0900: 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71  s subclass of sq
0910: 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69  lite3_file speci
0920: 66 69 63 20 66 6f 72 20 74 68 65 20 4f 53 2f 32  fic for the OS/2
0930: 0a 2a 2a 20 70 72 6f 74 61 62 69 6c 69 74 79 20  .** protability 
0940: 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 72 75 63 74  layer..*/.struct
0950: 20 6f 73 32 46 69 6c 65 20 7b 0a 20 20 63 6f 6e   os2File {.  con
0960: 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
0970: 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20  thods *pMethod; 
0980: 20 2f 2a 20 41 6c 77 61 79 73 20 74 68 65 20 66   /* Always the f
0990: 69 72 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  irst entry */.  
09a0: 48 46 49 4c 45 20 68 3b 20 20 20 20 20 20 20 20  HFILE h;        
09b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
09c0: 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e  dle for accessin
09d0: 67 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  g the file */.  
09e0: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
09f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
0a00: 67 73 20 70 72 6f 76 69 64 65 64 20 74 6f 20 6f  gs provided to o
0a10: 73 32 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  s2Open() */.  in
0a20: 74 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  t locktype;     
0a30: 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
0a40: 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c  of lock currentl
0a50: 79 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66  y held on this f
0a60: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43  ile */.  int szC
0a70: 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20  hunk;           
0a80: 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65     /* Chunk size
0a90: 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   configured by F
0aa0: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
0ab0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  */.  char *zFull
0ac0: 50 61 74 68 43 70 3b 20 20 20 20 20 20 20 20 2f  PathCp;        /
0ad0: 2a 20 46 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65  * Full path name
0ae0: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   of this file */
0af0: 0a 20 20 6f 73 32 53 68 6d 4c 69 6e 6b 20 2a 70  .  os2ShmLink *p
0b00: 53 68 6d 4c 69 6e 6b 3b 20 20 20 20 20 2f 2a 20  ShmLink;     /* 
0b10: 49 6e 73 74 61 6e 63 65 20 6f 66 20 73 68 61 72  Instance of shar
0b20: 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74 68 69  ed memory on thi
0b30: 73 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 23 64  s file */.};..#d
0b40: 65 66 69 6e 65 20 4c 4f 43 4b 5f 54 49 4d 45 4f  efine LOCK_TIMEO
0b50: 55 54 20 31 30 4c 20 2f 2a 20 74 68 65 20 64 65  UT 10L /* the de
0b60: 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 74 69  fault locking ti
0b70: 6d 65 6f 75 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  meout */../*.** 
0b80: 4d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d  Missing from som
0b90: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  e versions of th
0ba0: 65 20 4f 53 2f 32 20 74 6f 6f 6c 6b 69 74 20 2d  e OS/2 toolkit -
0bb0: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f  .** used to allo
0bc0: 63 61 74 65 20 66 72 6f 6d 20 68 69 67 68 20 6d  cate from high m
0bd0: 65 6d 6f 72 79 20 69 66 20 70 6f 73 73 69 62 6c  emory if possibl
0be0: 65 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 42 4a  e.*/.#ifndef OBJ
0bf0: 5f 41 4e 59 0a 23 20 64 65 66 69 6e 65 20 4f 42  _ANY.# define OB
0c00: 4a 5f 41 4e 59 20 30 78 30 30 30 30 30 34 30 30  J_ANY 0x00000400
0c10: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 2a 2a 2a 2a 2a  .#endif../******
0c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c60: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  *******.** The n
0c70: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ext group of rou
0c80: 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20  tines implement 
0c90: 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  the I/O methods 
0ca0: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
0cb0: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
0cc0: 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a  ethods object..*
0cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
0d20: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
0d30: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
0d40: 74 20 6f 73 32 43 6c 6f 73 65 28 20 73 71 6c 69  t os2Close( sqli
0d50: 74 65 33 5f 66 69 6c 65 20 2a 69 64 20 29 7b 0a  te3_file *id ){.
0d60: 20 20 41 50 49 52 45 54 20 72 63 3b 0a 20 20 6f    APIRET rc;.  o
0d70: 73 32 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  s2File *pFile = 
0d80: 28 6f 73 32 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  (os2File*)id;.. 
0d90: 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
0da0: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 20 22 43  ;.  OSTRACE(( "C
0db0: 4c 4f 53 45 20 25 64 20 28 25 73 29 5c 6e 22 2c  LOSE %d (%s)\n",
0dc0: 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
0dd0: 2d 3e 7a 46 75 6c 6c 50 61 74 68 43 70 20 29 29  ->zFullPathCp ))
0de0: 3b 0a 0a 20 20 72 63 20 3d 20 44 6f 73 43 6c 6f  ;..  rc = DosClo
0df0: 73 65 28 20 70 46 69 6c 65 2d 3e 68 20 29 3b 0a  se( pFile->h );.
0e00: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 66 6c  .  if( pFile->fl
0e10: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
0e20: 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
0e30: 29 0a 20 20 20 20 44 6f 73 46 6f 72 63 65 44 65  ).    DosForceDe
0e40: 6c 65 74 65 28 20 28 50 53 5a 29 70 46 69 6c 65  lete( (PSZ)pFile
0e50: 2d 3e 7a 46 75 6c 6c 50 61 74 68 43 70 20 29 3b  ->zFullPathCp );
0e60: 0a 0a 20 20 66 72 65 65 28 20 70 46 69 6c 65 2d  ..  free( pFile-
0e70: 3e 7a 46 75 6c 6c 50 61 74 68 43 70 20 29 3b 0a  >zFullPathCp );.
0e80: 20 20 70 46 69 6c 65 2d 3e 7a 46 75 6c 6c 50 61    pFile->zFullPa
0e90: 74 68 43 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70  thCp = NULL;.  p
0ea0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
0eb0: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 70 46 69 6c   NO_LOCK;.  pFil
0ec0: 65 2d 3e 68 20 3d 20 28 48 46 49 4c 45 29 2d 31  e->h = (HFILE)-1
0ed0: 3b 0a 20 20 70 46 69 6c 65 2d 3e 66 6c 61 67 73  ;.  pFile->flags
0ee0: 20 3d 20 30 3b 0a 0a 20 20 4f 70 65 6e 43 6f 75   = 0;..  OpenCou
0ef0: 6e 74 65 72 28 20 2d 31 20 29 3b 0a 20 20 72 65  nter( -1 );.  re
0f00: 74 75 72 6e 20 72 63 20 3d 3d 20 4e 4f 5f 45 52  turn rc == NO_ER
0f10: 52 4f 52 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ROR ? SQLITE_OK 
0f20: 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  : SQLITE_IOERR;.
0f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
0f40: 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
0f50: 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
0f60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
0f70: 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
0f80: 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
0f90: 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
0fa0: 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
0fb0: 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
0fc0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
0fd0: 20 6f 73 32 52 65 61 64 28 0a 20 20 73 71 6c 69   os2Read(.  sqli
0fe0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20  te3_file *id,   
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1000: 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ile to read from
1010: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
1020: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1030: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
1040: 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73  ontent into this
1050: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
1060: 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1080: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1090: 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c  to read */.  sql
10a0: 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
10b0: 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
10c0: 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74  Begin reading at
10d0: 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a   this offset */.
10e0: 29 7b 0a 20 20 55 4c 4f 4e 47 20 66 69 6c 65 4c  ){.  ULONG fileL
10f0: 6f 63 61 74 69 6f 6e 20 3d 20 30 4c 3b 0a 20 20  ocation = 0L;.  
1100: 55 4c 4f 4e 47 20 67 6f 74 3b 0a 20 20 6f 73 32  ULONG got;.  os2
1110: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 6f  File *pFile = (o
1120: 73 32 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73  s2File*)id;.  as
1130: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
1140: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1150: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
1160: 49 4f 45 52 52 5f 52 45 41 44 20 29 3b 0a 20 20  IOERR_READ );.  
1170: 4f 53 54 52 41 43 45 28 28 20 22 52 45 41 44 20  OSTRACE(( "READ 
1180: 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  %d lock=%d\n", p
1190: 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
11a0: 6c 6f 63 6b 74 79 70 65 20 29 29 3b 0a 20 20 69  locktype ));.  i
11b0: 66 28 20 44 6f 73 53 65 74 46 69 6c 65 50 74 72  f( DosSetFilePtr
11c0: 28 70 46 69 6c 65 2d 3e 68 2c 20 6f 66 66 73 65  (pFile->h, offse
11d0: 74 2c 20 46 49 4c 45 5f 42 45 47 49 4e 2c 20 26  t, FILE_BEGIN, &
11e0: 66 69 6c 65 4c 6f 63 61 74 69 6f 6e 29 20 21 3d  fileLocation) !=
11f0: 20 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20   NO_ERROR ){.   
1200: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1210: 4f 45 52 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OERR;.  }.  if( 
1220: 44 6f 73 52 65 61 64 28 20 70 46 69 6c 65 2d 3e  DosRead( pFile->
1230: 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 67  h, pBuf, amt, &g
1240: 6f 74 20 29 20 21 3d 20 4e 4f 5f 45 52 52 4f 52  ot ) != NO_ERROR
1250: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1260: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
1270: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 6f 74 20  ;.  }.  if( got 
1280: 3d 3d 20 28 55 4c 4f 4e 47 29 61 6d 74 20 29 0a  == (ULONG)amt ).
1290: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12a0: 45 5f 4f 4b 3b 0a 20 20 65 6c 73 65 20 7b 0a 20  E_OK;.  else {. 
12b0: 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 6f 72     /* Unread por
12c0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 69 6e 70  tions of the inp
12d0: 75 74 20 62 75 66 66 65 72 20 6d 75 73 74 20 62  ut buffer must b
12e0: 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f  e zero-filled */
12f0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63  .    memset(&((c
1300: 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c  har*)pBuf)[got],
1310: 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20   0, amt-got);.  
1320: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1330: 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1340: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ;.  }.}../*.** W
1350: 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61  rite data from a
1360: 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66   buffer into a f
1370: 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ile.  Return SQL
1380: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
1390: 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68  s.** or some oth
13a0: 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e  er error code on
13b0: 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
13c0: 74 69 63 20 69 6e 74 20 6f 73 32 57 72 69 74 65  tic int os2Write
13d0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
13e0: 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20   *id,           
13f0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77      /* File to w
1400: 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63  rite into */.  c
1410: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1430: 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f 20 62  * The bytes to b
1440: 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  e written */.  i
1450: 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1470: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1480: 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  s to write */.  
1490: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
14a0: 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  fset            
14b0: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74  /* Offset into t
14c0: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69 6e  he file to begin
14d0: 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29   writing at */.)
14e0: 7b 0a 20 20 55 4c 4f 4e 47 20 66 69 6c 65 4c 6f  {.  ULONG fileLo
14f0: 63 61 74 69 6f 6e 20 3d 20 30 4c 3b 0a 20 20 41  cation = 0L;.  A
1500: 50 49 52 45 54 20 72 63 20 3d 20 4e 4f 5f 45 52  PIRET rc = NO_ER
1510: 52 4f 52 3b 0a 20 20 55 4c 4f 4e 47 20 77 72 6f  ROR;.  ULONG wro
1520: 74 65 3b 0a 20 20 6f 73 32 46 69 6c 65 20 2a 70  te;.  os2File *p
1530: 46 69 6c 65 20 3d 20 28 6f 73 32 46 69 6c 65 2a  File = (os2File*
1540: 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69  )id;.  assert( i
1550: 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61  d!=0 );.  Simula
1560: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
1570: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1580: 52 49 54 45 20 29 3b 0a 20 20 53 69 6d 75 6c 61  RITE );.  Simula
1590: 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
15a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
15b0: 55 4c 4c 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ULL );.  OSTRACE
15c0: 28 28 20 22 57 52 49 54 45 20 25 64 20 6c 6f 63  (( "WRITE %d loc
15d0: 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
15e0: 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
15f0: 70 65 20 29 29 3b 0a 20 20 69 66 28 20 44 6f 73  pe ));.  if( Dos
1600: 53 65 74 46 69 6c 65 50 74 72 28 70 46 69 6c 65  SetFilePtr(pFile
1610: 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 46 49 4c  ->h, offset, FIL
1620: 45 5f 42 45 47 49 4e 2c 20 26 66 69 6c 65 4c 6f  E_BEGIN, &fileLo
1630: 63 61 74 69 6f 6e 29 20 21 3d 20 4e 4f 5f 45 52  cation) != NO_ER
1640: 52 4f 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ROR ){.    retur
1650: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
1660: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61 6d    }.  assert( am
1670: 74 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  t>0 );.  while( 
1680: 61 6d 74 20 3e 20 30 20 26 26 0a 20 20 20 20 20  amt > 0 &&.     
1690: 20 20 20 20 28 20 72 63 20 3d 20 44 6f 73 57 72      ( rc = DosWr
16a0: 69 74 65 28 20 70 46 69 6c 65 2d 3e 68 2c 20 28  ite( pFile->h, (
16b0: 50 56 4f 49 44 29 70 42 75 66 2c 20 61 6d 74 2c  PVOID)pBuf, amt,
16c0: 20 26 77 72 6f 74 65 20 29 20 29 20 3d 3d 20 4e   &wrote ) ) == N
16d0: 4f 5f 45 52 52 4f 52 20 26 26 0a 20 20 20 20 20  O_ERROR &&.     
16e0: 20 20 20 20 77 72 6f 74 65 20 3e 20 30 0a 20 20      wrote > 0.  
16f0: 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72  ){.    amt -= wr
1700: 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
1710: 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
1720: 72 6f 74 65 5d 3b 0a 20 20 7d 0a 0a 20 20 72 65  rote];.  }..  re
1730: 74 75 72 6e 20 28 20 72 63 20 21 3d 20 4e 4f 5f  turn ( rc != NO_
1740: 45 52 52 4f 52 20 7c 7c 20 61 6d 74 20 3e 20 28  ERROR || amt > (
1750: 69 6e 74 29 77 72 6f 74 65 20 29 20 3f 20 53 51  int)wrote ) ? SQ
1760: 4c 49 54 45 5f 46 55 4c 4c 20 3a 20 53 51 4c 49  LITE_FULL : SQLI
1770: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1780: 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e  Truncate an open
1790: 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69   file to a speci
17a0: 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61  fied size.*/.sta
17b0: 74 69 63 20 69 6e 74 20 6f 73 32 54 72 75 6e 63  tic int os2Trunc
17c0: 61 74 65 28 20 73 71 6c 69 74 65 33 5f 66 69 6c  ate( sqlite3_fil
17d0: 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65  e *id, i64 nByte
17e0: 20 29 7b 0a 20 20 41 50 49 52 45 54 20 72 63 3b   ){.  APIRET rc;
17f0: 0a 20 20 6f 73 32 46 69 6c 65 20 2a 70 46 69 6c  .  os2File *pFil
1800: 65 20 3d 20 28 6f 73 32 46 69 6c 65 2a 29 69 64  e = (os2File*)id
1810: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ;.  assert( id!=
1820: 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  0 );.  OSTRACE((
1830: 20 22 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c   "TRUNCATE %d %l
1840: 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  ld\n", pFile->h,
1850: 20 6e 42 79 74 65 20 29 29 3b 0a 20 20 53 69 6d   nByte ));.  Sim
1860: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
1870: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1880: 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20  R_TRUNCATE );.. 
1890: 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20   /* If the user 
18a0: 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61  has configured a
18b0: 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20   chunk-size for 
18c0: 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63  this file, trunc
18d0: 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c  ate the.  ** fil
18e0: 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e  e so that it con
18f0: 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65  sists of an inte
1900: 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  ger number of ch
1910: 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20  unks (i.e. the. 
1920: 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20   ** actual file 
1930: 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f  size after the o
1940: 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20  peration may be 
1950: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
1960: 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73  requested.  ** s
1970: 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ize)..  */.  if(
1980: 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
1990: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28  ){.    nByte = (
19a0: 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e  (nByte + pFile->
19b0: 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69  szChunk - 1)/pFi
19c0: 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
19d0: 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
19e0: 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 44 6f 73   }.  .  rc = Dos
19f0: 53 65 74 46 69 6c 65 53 69 7a 65 28 20 70 46 69  SetFileSize( pFi
1a00: 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 20 29 3b 0a  le->h, nByte );.
1a10: 20 20 72 65 74 75 72 6e 20 72 63 20 3d 3d 20 4e    return rc == N
1a20: 4f 5f 45 52 52 4f 52 20 3f 20 53 51 4c 49 54 45  O_ERROR ? SQLITE
1a30: 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45  _OK : SQLITE_IOE
1a40: 52 52 5f 54 52 55 4e 43 41 54 45 3b 0a 7d 0a 0a  RR_TRUNCATE;.}..
1a50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1a60: 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ST./*.** Count t
1a70: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c  he number of ful
1a80: 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61  lsyncs and norma
1a90: 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69  l syncs.  This i
1aa0: 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a  s used to test.*
1ab0: 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64  * that syncs and
1ac0: 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f   fullsyncs are o
1ad0: 63 63 75 72 69 6e 67 20 61 74 20 74 68 65 20 72  ccuring at the r
1ae0: 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69  ight times..*/.i
1af0: 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  nt sqlite3_sync_
1b00: 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73  count = 0;.int s
1b10: 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
1b20: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
1b30: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  f../*.** Make su
1b40: 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f  re all writes to
1b50: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69   a particular fi
1b60: 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64  le are committed
1b70: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61   to disk..*/.sta
1b80: 74 69 63 20 69 6e 74 20 6f 73 32 53 79 6e 63 28  tic int os2Sync(
1b90: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
1ba0: 64 2c 20 69 6e 74 20 66 6c 61 67 73 20 29 7b 0a  d, int flags ){.
1bb0: 20 20 6f 73 32 46 69 6c 65 20 2a 70 46 69 6c 65    os2File *pFile
1bc0: 20 3d 20 28 6f 73 32 46 69 6c 65 2a 29 69 64 3b   = (os2File*)id;
1bd0: 0a 20 20 4f 53 54 52 41 43 45 28 28 20 22 53 59  .  OSTRACE(( "SY
1be0: 4e 43 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22  NC %d lock=%d\n"
1bf0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c  , pFile->h, pFil
1c00: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 29 3b 0a  e->locktype ));.
1c10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1c20: 53 54 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  ST.  if( flags &
1c30: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
1c40: 4c 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  L){.    sqlite3_
1c50: 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  fullsync_count++
1c60: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1c70: 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  sync_count++;.#e
1c80: 6e 64 69 66 0a 20 20 2f 2a 20 49 66 20 77 65 20  ndif.  /* If we 
1c90: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
1ca0: 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
1cb0: 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
1cc0: 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
1cd0: 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  -op.  */.#ifdef 
1ce0: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
1cf0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1d00: 52 28 70 46 69 6c 65 29 3b 0a 20 20 72 65 74 75  R(pFile);.  retu
1d10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
1d20: 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 44 6f 73  lse.  return Dos
1d30: 52 65 73 65 74 42 75 66 66 65 72 28 20 70 46 69  ResetBuffer( pFi
1d40: 6c 65 2d 3e 68 20 29 20 3d 3d 20 4e 4f 5f 45 52  le->h ) == NO_ER
1d50: 52 4f 52 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ROR ? SQLITE_OK 
1d60: 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  : SQLITE_IOERR;.
1d70: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
1d80: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
1d90: 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
1da0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
1db0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 32 46  .static int os2F
1dc0: 69 6c 65 53 69 7a 65 28 20 73 71 6c 69 74 65 33  ileSize( sqlite3
1dd0: 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74  _file *id, sqlit
1de0: 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 20  e3_int64 *pSize 
1df0: 29 7b 0a 20 20 41 50 49 52 45 54 20 72 63 20 3d  ){.  APIRET rc =
1e00: 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 46 49 4c   NO_ERROR;.  FIL
1e10: 45 53 54 41 54 55 53 33 20 66 73 74 73 33 46 69  ESTATUS3 fsts3Fi
1e20: 6c 65 49 6e 66 6f 3b 0a 20 20 6d 65 6d 73 65 74  leInfo;.  memset
1e30: 28 26 66 73 74 73 33 46 69 6c 65 49 6e 66 6f 2c  (&fsts3FileInfo,
1e40: 20 30 2c 20 73 69 7a 65 6f 66 28 66 73 74 73 33   0, sizeof(fsts3
1e50: 46 69 6c 65 49 6e 66 6f 29 29 3b 0a 20 20 61 73  FileInfo));.  as
1e60: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
1e70: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1e80: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
1e90: 49 4f 45 52 52 5f 46 53 54 41 54 20 29 3b 0a 20  IOERR_FSTAT );. 
1ea0: 20 72 63 20 3d 20 44 6f 73 51 75 65 72 79 46 69   rc = DosQueryFi
1eb0: 6c 65 49 6e 66 6f 28 20 28 28 6f 73 32 46 69 6c  leInfo( ((os2Fil
1ec0: 65 2a 29 69 64 29 2d 3e 68 2c 20 46 49 4c 5f 53  e*)id)->h, FIL_S
1ed0: 54 41 4e 44 41 52 44 2c 20 26 66 73 74 73 33 46  TANDARD, &fsts3F
1ee0: 69 6c 65 49 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  ileInfo, sizeof(
1ef0: 46 49 4c 45 53 54 41 54 55 53 33 29 20 29 3b 0a  FILESTATUS3) );.
1f00: 20 20 69 66 28 20 72 63 20 3d 3d 20 4e 4f 5f 45    if( rc == NO_E
1f10: 52 52 4f 52 20 29 7b 0a 20 20 20 20 2a 70 53 69  RROR ){.    *pSi
1f20: 7a 65 20 3d 20 66 73 74 73 33 46 69 6c 65 49 6e  ze = fsts3FileIn
1f30: 66 6f 2e 63 62 46 69 6c 65 3b 0a 20 20 20 20 72  fo.cbFile;.    r
1f40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1f60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1f70: 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 7d 0a 0a  R_FSTAT;.  }.}..
1f80: 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
1f90: 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2f 0a  reader lock..*/.
1fa0: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 52 65  static int getRe
1fb0: 61 64 4c 6f 63 6b 28 20 6f 73 32 46 69 6c 65 20  adLock( os2File 
1fc0: 2a 70 46 69 6c 65 20 29 7b 0a 20 20 46 49 4c 45  *pFile ){.  FILE
1fd0: 4c 4f 43 4b 20 20 4c 6f 63 6b 41 72 65 61 2c 0a  LOCK  LockArea,.
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 55 6e 6c 6f              Unlo
1ff0: 63 6b 41 72 65 61 3b 0a 20 20 41 50 49 52 45 54  ckArea;.  APIRET
2000: 20 72 65 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26   res;.  memset(&
2010: 4c 6f 63 6b 41 72 65 61 2c 20 30 2c 20 73 69 7a  LockArea, 0, siz
2020: 65 6f 66 28 4c 6f 63 6b 41 72 65 61 29 29 3b 0a  eof(LockArea));.
2030: 20 20 6d 65 6d 73 65 74 28 26 55 6e 6c 6f 63 6b    memset(&Unlock
2040: 41 72 65 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Area, 0, sizeof(
2050: 55 6e 6c 6f 63 6b 41 72 65 61 29 29 3b 0a 20 20  UnlockArea));.  
2060: 4c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74  LockArea.lOffset
2070: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
2080: 0a 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e  .  LockArea.lRan
2090: 67 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  ge = SHARED_SIZE
20a0: 3b 0a 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c  ;.  UnlockArea.l
20b0: 4f 66 66 73 65 74 20 3d 20 30 4c 3b 0a 20 20 55  Offset = 0L;.  U
20c0: 6e 6c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65  nlockArea.lRange
20d0: 20 3d 20 30 4c 3b 0a 20 20 72 65 73 20 3d 20 44   = 0L;.  res = D
20e0: 6f 73 53 65 74 46 69 6c 65 4c 6f 63 6b 73 28 20  osSetFileLocks( 
20f0: 70 46 69 6c 65 2d 3e 68 2c 20 26 55 6e 6c 6f 63  pFile->h, &Unloc
2100: 6b 41 72 65 61 2c 20 26 4c 6f 63 6b 41 72 65 61  kArea, &LockArea
2110: 2c 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c 20  , LOCK_TIMEOUT, 
2120: 31 4c 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  1L );.  OSTRACE(
2130: 28 20 22 47 45 54 52 45 41 44 4c 4f 43 4b 20 25  ( "GETREADLOCK %
2140: 64 20 72 65 73 3d 25 64 5c 6e 22 2c 20 70 46 69  d res=%d\n", pFi
2150: 6c 65 2d 3e 68 2c 20 72 65 73 20 29 29 3b 0a 20  le->h, res ));. 
2160: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
2170: 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61  /*.** Undo a rea
2180: 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  dlock.*/.static 
2190: 69 6e 74 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f  int unlockReadLo
21a0: 63 6b 28 20 6f 73 32 46 69 6c 65 20 2a 69 64 20  ck( os2File *id 
21b0: 29 7b 0a 20 20 46 49 4c 45 4c 4f 43 4b 20 20 4c  ){.  FILELOCK  L
21c0: 6f 63 6b 41 72 65 61 2c 0a 20 20 20 20 20 20 20  ockArea,.       
21d0: 20 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 3b       UnlockArea;
21e0: 0a 20 20 41 50 49 52 45 54 20 72 65 73 3b 0a 20  .  APIRET res;. 
21f0: 20 6d 65 6d 73 65 74 28 26 4c 6f 63 6b 41 72 65   memset(&LockAre
2200: 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 63  a, 0, sizeof(Loc
2210: 6b 41 72 65 61 29 29 3b 0a 20 20 6d 65 6d 73 65  kArea));.  memse
2220: 74 28 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 30  t(&UnlockArea, 0
2230: 2c 20 73 69 7a 65 6f 66 28 55 6e 6c 6f 63 6b 41  , sizeof(UnlockA
2240: 72 65 61 29 29 3b 0a 20 20 4c 6f 63 6b 41 72 65  rea));.  LockAre
2250: 61 2e 6c 4f 66 66 73 65 74 20 3d 20 30 4c 3b 0a  a.lOffset = 0L;.
2260: 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67    LockArea.lRang
2270: 65 20 3d 20 30 4c 3b 0a 20 20 55 6e 6c 6f 63 6b  e = 0L;.  Unlock
2280: 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 53  Area.lOffset = S
2290: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 55  HARED_FIRST;.  U
22a0: 6e 6c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65  nlockArea.lRange
22b0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
22c0: 20 20 72 65 73 20 3d 20 44 6f 73 53 65 74 46 69    res = DosSetFi
22d0: 6c 65 4c 6f 63 6b 73 28 20 69 64 2d 3e 68 2c 20  leLocks( id->h, 
22e0: 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 26 4c 6f  &UnlockArea, &Lo
22f0: 63 6b 41 72 65 61 2c 20 4c 4f 43 4b 5f 54 49 4d  ckArea, LOCK_TIM
2300: 45 4f 55 54 2c 20 31 4c 20 29 3b 0a 20 20 4f 53  EOUT, 1L );.  OS
2310: 54 52 41 43 45 28 28 20 22 55 4e 4c 4f 43 4b 2d  TRACE(( "UNLOCK-
2320: 52 45 41 44 4c 4f 43 4b 20 66 69 6c 65 20 68 61  READLOCK file ha
2330: 6e 64 6c 65 3d 25 64 20 72 65 73 3d 25 64 3f 5c  ndle=%d res=%d?\
2340: 6e 22 2c 20 69 64 2d 3e 68 2c 20 72 65 73 20 29  n", id->h, res )
2350: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
2360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
2370: 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
2380: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
2390: 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
23a0: 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
23b0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
23c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
23d0: 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
23e0: 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
23f0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
2400: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
2410: 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
2420: 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
2430: 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
2440: 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
2450: 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
2460: 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
2470: 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
2480: 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
2490: 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
24a0: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
24b0: 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
24c0: 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
24d0: 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
24e0: 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
24f0: 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
2500: 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
2510: 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
2520: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
2530: 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
2540: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
2550: 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
2560: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
2570: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
2580: 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
2590: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
25a0: 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
25b0: 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
25c0: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
25d0: 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
25e0: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
25f0: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
2600: 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
2610: 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
2620: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
2630: 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
2640: 63 6b 2e 20 20 54 68 65 20 6f 73 32 55 6e 6c 6f  ck.  The os2Unlo
2650: 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ck() routine.** 
2660: 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73  erases all locks
2670: 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74   at once and ret
2680: 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74  urns us immediat
2690: 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c  ely to locking l
26a0: 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73  evel 0..** It is
26b0: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
26c0: 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   lower the locki
26d0: 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65  ng level one ste
26e0: 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f  p at a time.  Yo
26f0: 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72  u.** must go str
2700: 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67  aight to locking
2710: 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61   level 0..*/.sta
2720: 74 69 63 20 69 6e 74 20 6f 73 32 4c 6f 63 6b 28  tic int os2Lock(
2730: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
2740: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 20  d, int locktype 
2750: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2760: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f  LITE_OK;       /
2770: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
2780: 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a  om subroutines *
2790: 2f 0a 20 20 41 50 49 52 45 54 20 72 65 73 20 3d  /.  APIRET res =
27a0: 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 20 2f 2a   NO_ERROR;    /*
27b0: 20 52 65 73 75 6c 74 20 6f 66 20 61 6e 20 4f 53   Result of an OS
27c0: 2f 32 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a  /2 lock call */.
27d0: 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70    int newLocktyp
27e0: 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  e;       /* Set 
27f0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
2800: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 62 65  to this value be
2810: 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
2820: 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67    int gotPending
2830: 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65  Lock = 0;/* True
2840: 20 69 66 20 77 65 20 61 63 71 75 69 72 65 64 20   if we acquired 
2850: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74  a PENDING lock t
2860: 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20 46 49  his time */.  FI
2870: 4c 45 4c 4f 43 4b 20 20 4c 6f 63 6b 41 72 65 61  LELOCK  LockArea
2880: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 55 6e  ,.            Un
2890: 6c 6f 63 6b 41 72 65 61 3b 0a 20 20 6f 73 32 46  lockArea;.  os2F
28a0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 6f 73  ile *pFile = (os
28b0: 32 46 69 6c 65 2a 29 69 64 3b 0a 20 20 6d 65 6d  2File*)id;.  mem
28c0: 73 65 74 28 26 4c 6f 63 6b 41 72 65 61 2c 20 30  set(&LockArea, 0
28d0: 2c 20 73 69 7a 65 6f 66 28 4c 6f 63 6b 41 72 65  , sizeof(LockAre
28e0: 61 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 55  a));.  memset(&U
28f0: 6e 6c 6f 63 6b 41 72 65 61 2c 20 30 2c 20 73 69  nlockArea, 0, si
2900: 7a 65 6f 66 28 55 6e 6c 6f 63 6b 41 72 65 61 29  zeof(UnlockArea)
2910: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  );.  assert( pFi
2920: 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41  le!=0 );.  OSTRA
2930: 43 45 28 28 20 22 4c 4f 43 4b 20 25 64 20 25 64  CE(( "LOCK %d %d
2940: 20 77 61 73 20 25 64 5c 6e 22 2c 20 70 46 69 6c   was %d\n", pFil
2950: 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20  e->h, locktype, 
2960: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
2970: 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
2980: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
2990: 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
29a0: 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
29b0: 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
29c0: 2a 20 6f 73 32 46 69 6c 65 2c 20 64 6f 20 6e 6f  * os2File, do no
29d0: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
29e0: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
29f0: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
2a00: 2a 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  * sqlite3_mutex_
2a10: 65 6e 74 65 72 28 29 20 68 61 73 6e 27 74 20 62  enter() hasn't b
2a20: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
2a30: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
2a40: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b  ->locktype>=lock
2a50: 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52  type ){.    OSTR
2a60: 41 43 45 28 28 20 22 4c 4f 43 4b 20 25 64 20 25  ACE(( "LOCK %d %
2a70: 64 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  d ok (already he
2a80: 6c 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ld)\n", pFile->h
2a90: 2c 20 6c 6f 63 6b 74 79 70 65 20 29 29 3b 0a 20  , locktype ));. 
2aa0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ab0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
2ac0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
2ad0: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
2ae0: 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20   correct.  */.  
2af0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
2b00: 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
2b10: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
2b20: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
2b30: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
2b40: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
2b50: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
2b60: 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
2b70: 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
2b80: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
2b90: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
2ba0: 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
2bb0: 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65  K byte if we nee
2bc0: 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50  d to acquire a P
2bd0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20  ENDING lock or. 
2be0: 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63   ** a SHARED loc
2bf0: 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63  k.  If we are ac
2c00: 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
2c10: 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69   lock, the acqui
2c20: 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74  sition of.  ** t
2c30: 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  he PENDING_LOCK 
2c40: 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72  byte is temporar
2c50: 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63  y..  */.  newLoc
2c60: 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c  ktype = pFile->l
2c70: 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 70  ocktype;.  if( p
2c80: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
2c90: 4e 4f 5f 4c 4f 43 4b 0a 20 20 20 20 20 20 7c 7c  NO_LOCK.      ||
2ca0: 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c   (locktype==EXCL
2cb0: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46  USIVE_LOCK && pF
2cc0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52  ile->locktype==R
2cd0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 0a 20 20  ESERVED_LOCK).  
2ce0: 29 7b 0a 20 20 20 20 4c 6f 63 6b 41 72 65 61 2e  ){.    LockArea.
2cf0: 6c 4f 66 66 73 65 74 20 3d 20 50 45 4e 44 49 4e  lOffset = PENDIN
2d00: 47 5f 42 59 54 45 3b 0a 20 20 20 20 4c 6f 63 6b  G_BYTE;.    Lock
2d10: 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20 31 4c  Area.lRange = 1L
2d20: 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61  ;.    UnlockArea
2d30: 2e 6c 4f 66 66 73 65 74 20 3d 20 30 4c 3b 0a 20  .lOffset = 0L;. 
2d40: 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 52     UnlockArea.lR
2d50: 61 6e 67 65 20 3d 20 30 4c 3b 0a 0a 20 20 20 20  ange = 0L;..    
2d60: 2f 2a 20 77 61 69 74 20 6c 6f 6e 67 65 72 20 74  /* wait longer t
2d70: 68 61 6e 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54  han LOCK_TIMEOUT
2d80: 20 68 65 72 65 20 6e 6f 74 20 74 6f 20 68 61 76   here not to hav
2d90: 65 20 74 6f 20 74 72 79 20 6d 75 6c 74 69 70 6c  e to try multipl
2da0: 65 20 74 69 6d 65 73 20 2a 2f 0a 20 20 20 20 72  e times */.    r
2db0: 65 73 20 3d 20 44 6f 73 53 65 74 46 69 6c 65 4c  es = DosSetFileL
2dc0: 6f 63 6b 73 28 20 70 46 69 6c 65 2d 3e 68 2c 20  ocks( pFile->h, 
2dd0: 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 26 4c 6f  &UnlockArea, &Lo
2de0: 63 6b 41 72 65 61 2c 20 31 30 30 4c 2c 20 30 4c  ckArea, 100L, 0L
2df0: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20   );.    if( res 
2e00: 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20  == NO_ERROR ){. 
2e10: 20 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c       gotPendingL
2e20: 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 4f  ock = 1;.      O
2e30: 53 54 52 41 43 45 28 28 20 22 4c 4f 43 4b 20 25  STRACE(( "LOCK %
2e40: 64 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 62  d pending lock b
2e50: 6f 6f 6c 65 61 6e 20 73 65 74 2e 20 20 72 65 73  oolean set.  res
2e60: 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
2e70: 2c 20 72 65 73 20 29 29 3b 0a 20 20 20 20 7d 0a  , res ));.    }.
2e80: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
2e90: 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a  e a shared lock.
2ea0: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
2eb0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
2ec0: 20 26 26 20 72 65 73 20 3d 3d 20 4e 4f 5f 45 52   && res == NO_ER
2ed0: 52 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ROR ){.    asser
2ee0: 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
2ef0: 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20  pe==NO_LOCK );. 
2f00: 20 20 20 72 65 73 20 3d 20 67 65 74 52 65 61 64     res = getRead
2f10: 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20  Lock(pFile);.   
2f20: 20 69 66 28 20 72 65 73 20 3d 3d 20 4e 4f 5f 45   if( res == NO_E
2f30: 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 6e 65  RROR ){.      ne
2f40: 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  wLocktype = SHAR
2f50: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  ED_LOCK;.    }. 
2f60: 20 20 20 4f 53 54 52 41 43 45 28 28 20 22 4c 4f     OSTRACE(( "LO
2f70: 43 4b 20 25 64 20 61 63 71 75 69 72 65 20 73 68  CK %d acquire sh
2f80: 61 72 65 64 20 6c 6f 63 6b 2e 20 72 65 73 3d 25  ared lock. res=%
2f90: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
2fa0: 72 65 73 20 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  res ));.  }..  /
2fb0: 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45  * Acquire a RESE
2fc0: 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  RVED lock.  */. 
2fd0: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52   if( locktype==R
2fe0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
2ff0: 72 65 73 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20  res == NO_ERROR 
3000: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
3010: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
3020: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
3030: 20 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66     LockArea.lOff
3040: 73 65 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  set = RESERVED_B
3050: 59 54 45 3b 0a 20 20 20 20 4c 6f 63 6b 41 72 65  YTE;.    LockAre
3060: 61 2e 6c 52 61 6e 67 65 20 3d 20 31 4c 3b 0a 20  a.lRange = 1L;. 
3070: 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 4f     UnlockArea.lO
3080: 66 66 73 65 74 20 3d 20 30 4c 3b 0a 20 20 20 20  ffset = 0L;.    
3090: 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67  UnlockArea.lRang
30a0: 65 20 3d 20 30 4c 3b 0a 20 20 20 20 72 65 73 20  e = 0L;.    res 
30b0: 3d 20 44 6f 73 53 65 74 46 69 6c 65 4c 6f 63 6b  = DosSetFileLock
30c0: 73 28 20 70 46 69 6c 65 2d 3e 68 2c 20 26 55 6e  s( pFile->h, &Un
30d0: 6c 6f 63 6b 41 72 65 61 2c 20 26 4c 6f 63 6b 41  lockArea, &LockA
30e0: 72 65 61 2c 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55  rea, LOCK_TIMEOU
30f0: 54 2c 20 30 4c 20 29 3b 0a 20 20 20 20 69 66 28  T, 0L );.    if(
3100: 20 72 65 73 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52   res == NO_ERROR
3110: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
3120: 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44  ktype = RESERVED
3130: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  _LOCK;.    }.   
3140: 20 4f 53 54 52 41 43 45 28 28 20 22 4c 4f 43 4b   OSTRACE(( "LOCK
3150: 20 25 64 20 61 63 71 75 69 72 65 20 72 65 73 65   %d acquire rese
3160: 72 76 65 64 20 6c 6f 63 6b 2e 20 72 65 73 3d 25  rved lock. res=%
3170: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
3180: 72 65 73 20 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  res ));.  }..  /
3190: 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44  * Acquire a PEND
31a0: 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  ING lock.  */.  
31b0: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
31c0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
31d0: 72 65 73 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20  res == NO_ERROR 
31e0: 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  ){.    newLockty
31f0: 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  pe = PENDING_LOC
3200: 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e  K;.    gotPendin
3210: 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 4f  gLock = 0;.    O
3220: 53 54 52 41 43 45 28 28 20 22 4c 4f 43 4b 20 25  STRACE(( "LOCK %
3230: 64 20 61 63 71 75 69 72 65 20 70 65 6e 64 69 6e  d acquire pendin
3240: 67 20 6c 6f 63 6b 2e 20 70 65 6e 64 69 6e 67 20  g lock. pending 
3250: 6c 6f 63 6b 20 62 6f 6f 6c 65 61 6e 20 75 6e 73  lock boolean uns
3260: 65 74 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  et.\n",.        
3270: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20         pFile->h 
3280: 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63  ));.  }..  /* Ac
3290: 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49  quire an EXCLUSI
32a0: 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  VE lock.  */.  i
32b0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
32c0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72  LUSIVE_LOCK && r
32d0: 65 73 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20 29  es == NO_ERROR )
32e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
32f0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53  ile->locktype>=S
3300: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
3310: 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65    res = unlockRe
3320: 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
3330: 20 20 20 4f 53 54 52 41 43 45 28 28 20 22 75 6e     OSTRACE(( "un
3340: 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22  readlock = %d\n"
3350: 2c 20 72 65 73 20 29 29 3b 0a 20 20 20 20 4c 6f  , res ));.    Lo
3360: 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d  ckArea.lOffset =
3370: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
3380: 20 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e     LockArea.lRan
3390: 67 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  ge = SHARED_SIZE
33a0: 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61  ;.    UnlockArea
33b0: 2e 6c 4f 66 66 73 65 74 20 3d 20 30 4c 3b 0a 20  .lOffset = 0L;. 
33c0: 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 52     UnlockArea.lR
33d0: 61 6e 67 65 20 3d 20 30 4c 3b 0a 20 20 20 20 72  ange = 0L;.    r
33e0: 65 73 20 3d 20 44 6f 73 53 65 74 46 69 6c 65 4c  es = DosSetFileL
33f0: 6f 63 6b 73 28 20 70 46 69 6c 65 2d 3e 68 2c 20  ocks( pFile->h, 
3400: 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 26 4c 6f  &UnlockArea, &Lo
3410: 63 6b 41 72 65 61 2c 20 4c 4f 43 4b 5f 54 49 4d  ckArea, LOCK_TIM
3420: 45 4f 55 54 2c 20 30 4c 20 29 3b 0a 20 20 20 20  EOUT, 0L );.    
3430: 69 66 28 20 72 65 73 20 3d 3d 20 4e 4f 5f 45 52  if( res == NO_ER
3440: 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  ROR ){.      new
3450: 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55  Locktype = EXCLU
3460: 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  SIVE_LOCK;.    }
3470: 65 6c 73 65 7b 0a 20 20 20 20 20 20 4f 53 54 52  else{.      OSTR
3480: 41 43 45 28 28 20 22 4f 53 2f 32 20 65 72 72 6f  ACE(( "OS/2 erro
3490: 72 2d 63 6f 64 65 20 3d 20 25 64 5c 6e 22 2c 20  r-code = %d\n", 
34a0: 72 65 73 20 29 29 3b 0a 20 20 20 20 20 20 67 65  res ));.      ge
34b0: 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
34c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53 54 52  ;.    }.    OSTR
34d0: 41 43 45 28 28 20 22 4c 4f 43 4b 20 25 64 20 61  ACE(( "LOCK %d a
34e0: 63 71 75 69 72 65 20 65 78 63 6c 75 73 69 76 65  cquire exclusive
34f0: 20 6c 6f 63 6b 2e 20 20 72 65 73 3d 25 64 5c 6e   lock.  res=%d\n
3500: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73  ", pFile->h, res
3510: 20 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   ));.  }..  /* I
3520: 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67  f we are holding
3530: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
3540: 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65  that ought to be
3550: 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a   released, then.
3560: 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20    ** release it 
3570: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
3580: 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26  gotPendingLock &
3590: 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
35a0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69  ED_LOCK ){.    i
35b0: 6e 74 20 72 3b 0a 20 20 20 20 4c 6f 63 6b 41 72  nt r;.    LockAr
35c0: 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 30 4c 3b  ea.lOffset = 0L;
35d0: 0a 20 20 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 52  .    LockArea.lR
35e0: 61 6e 67 65 20 3d 20 30 4c 3b 0a 20 20 20 20 55  ange = 0L;.    U
35f0: 6e 6c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65  nlockArea.lOffse
3600: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
3610: 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61  ;.    UnlockArea
3620: 2e 6c 52 61 6e 67 65 20 3d 20 31 4c 3b 0a 20 20  .lRange = 1L;.  
3630: 20 20 72 20 3d 20 44 6f 73 53 65 74 46 69 6c 65    r = DosSetFile
3640: 4c 6f 63 6b 73 28 20 70 46 69 6c 65 2d 3e 68 2c  Locks( pFile->h,
3650: 20 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 26 4c   &UnlockArea, &L
3660: 6f 63 6b 41 72 65 61 2c 20 4c 4f 43 4b 5f 54 49  ockArea, LOCK_TI
3670: 4d 45 4f 55 54 2c 20 30 4c 20 29 3b 0a 20 20 20  MEOUT, 0L );.   
3680: 20 4f 53 54 52 41 43 45 28 28 20 22 4c 4f 43 4b   OSTRACE(( "LOCK
3690: 20 25 64 20 75 6e 6c 6f 63 6b 69 6e 67 20 70 65   %d unlocking pe
36a0: 6e 64 69 6e 67 2f 69 73 20 73 68 61 72 65 64 2e  nding/is shared.
36b0: 20 72 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d   r=%d\n", pFile-
36c0: 3e 68 2c 20 72 20 29 29 3b 0a 20 20 7d 0a 0a 20  >h, r ));.  }.. 
36d0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73   /* Update the s
36e0: 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b  tate of the lock
36f0: 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65   has held in the
3700: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3710: 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72   then.  ** retur
3720: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
3730: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20  e result code.. 
3740: 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 3d 3d   */.  if( res ==
3750: 20 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20   NO_ERROR ){.   
3760: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
3770: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 53  .  }else{.    OS
3780: 54 52 41 43 45 28 28 20 22 4c 4f 43 4b 20 46 41  TRACE(( "LOCK FA
3790: 49 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20 66  ILED %d trying f
37a0: 6f 72 20 25 64 20 62 75 74 20 67 6f 74 20 25 64  or %d but got %d
37b0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63               loc
37d0: 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79  ktype, newLockty
37e0: 70 65 20 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  pe ));.    rc = 
37f0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
3800: 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
3810: 70 65 20 3d 20 6e 65 77 4c 6f 63 6b 74 79 70 65  pe = newLocktype
3820: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 20 22 4c  ;.  OSTRACE(( "L
3830: 4f 43 4b 20 25 64 20 6e 6f 77 20 25 64 5c 6e 22  OCK %d now %d\n"
3840: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c  , pFile->h, pFil
3850: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 29 3b 0a  e->locktype ));.
3860: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
3870: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3880: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
3890: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
38a0: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
38b0: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
38c0: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
38d0: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
38e0: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
38f0: 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e   is held, return
3900: 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74  .** non-zero, ot
3910: 68 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f  herwise zero..*/
3920: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 32 43  .static int os2C
3930: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
3940: 28 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ( sqlite3_file *
3950: 69 64 2c 20 69 6e 74 20 2a 70 4f 75 74 20 29 7b  id, int *pOut ){
3960: 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
3970: 6f 73 32 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  os2File *pFile =
3980: 20 28 6f 73 32 46 69 6c 65 2a 29 69 64 3b 0a 20   (os2File*)id;. 
3990: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d   assert( pFile!=
39a0: 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
39b0: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45  ->locktype>=RESE
39c0: 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
39d0: 20 72 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52   r = 1;.    OSTR
39e0: 41 43 45 28 28 20 22 54 45 53 54 20 57 52 2d 4c  ACE(( "TEST WR-L
39f0: 4f 43 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c  OCK %d %d (local
3a00: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
3a10: 72 20 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  r ));.  }else{. 
3a20: 20 20 20 46 49 4c 45 4c 4f 43 4b 20 20 4c 6f 63     FILELOCK  Loc
3a30: 6b 41 72 65 61 2c 0a 20 20 20 20 20 20 20 20 20  kArea,.         
3a40: 20 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 3b       UnlockArea;
3a50: 0a 20 20 20 20 41 50 49 52 45 54 20 72 63 20 3d  .    APIRET rc =
3a60: 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 6d   NO_ERROR;.    m
3a70: 65 6d 73 65 74 28 26 4c 6f 63 6b 41 72 65 61 2c  emset(&LockArea,
3a80: 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 63 6b 41   0, sizeof(LockA
3a90: 72 65 61 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  rea));.    memse
3aa0: 74 28 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 30  t(&UnlockArea, 0
3ab0: 2c 20 73 69 7a 65 6f 66 28 55 6e 6c 6f 63 6b 41  , sizeof(UnlockA
3ac0: 72 65 61 29 29 3b 0a 20 20 20 20 4c 6f 63 6b 41  rea));.    LockA
3ad0: 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 52 45  rea.lOffset = RE
3ae0: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
3af0: 20 4c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65   LockArea.lRange
3b00: 20 3d 20 31 4c 3b 0a 20 20 20 20 55 6e 6c 6f 63   = 1L;.    Unloc
3b10: 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20  kArea.lOffset = 
3b20: 30 4c 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72  0L;.    UnlockAr
3b30: 65 61 2e 6c 52 61 6e 67 65 20 3d 20 30 4c 3b 0a  ea.lRange = 0L;.
3b40: 20 20 20 20 72 63 20 3d 20 44 6f 73 53 65 74 46      rc = DosSetF
3b50: 69 6c 65 4c 6f 63 6b 73 28 20 70 46 69 6c 65 2d  ileLocks( pFile-
3b60: 3e 68 2c 20 26 55 6e 6c 6f 63 6b 41 72 65 61 2c  >h, &UnlockArea,
3b70: 20 26 4c 6f 63 6b 41 72 65 61 2c 20 4c 4f 43 4b   &LockArea, LOCK
3b80: 5f 54 49 4d 45 4f 55 54 2c 20 30 4c 20 29 3b 0a  _TIMEOUT, 0L );.
3b90: 20 20 20 20 4f 53 54 52 41 43 45 28 28 20 22 54      OSTRACE(( "T
3ba0: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 6c  EST WR-LOCK %d l
3bb0: 6f 63 6b 20 72 65 73 65 72 76 65 64 20 62 79 74  ock reserved byt
3bc0: 65 20 72 63 3d 25 64 5c 6e 22 2c 20 70 46 69 6c  e rc=%d\n", pFil
3bd0: 65 2d 3e 68 2c 20 72 63 20 29 29 3b 0a 20 20 20  e->h, rc ));.   
3be0: 20 69 66 28 20 72 63 20 3d 3d 20 4e 4f 5f 45 52   if( rc == NO_ER
3bf0: 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 41 50 49  ROR ){.      API
3c00: 52 45 54 20 72 63 75 20 3d 20 4e 4f 5f 45 52 52  RET rcu = NO_ERR
3c10: 4f 52 3b 20 2f 2a 20 72 65 74 75 72 6e 20 63 6f  OR; /* return co
3c20: 64 65 20 66 6f 72 20 75 6e 6c 6f 63 6b 69 6e 67  de for unlocking
3c30: 20 2a 2f 0a 20 20 20 20 20 20 4c 6f 63 6b 41 72   */.      LockAr
3c40: 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 30 4c 3b  ea.lOffset = 0L;
3c50: 0a 20 20 20 20 20 20 4c 6f 63 6b 41 72 65 61 2e  .      LockArea.
3c60: 6c 52 61 6e 67 65 20 3d 20 30 4c 3b 0a 20 20 20  lRange = 0L;.   
3c70: 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 4f     UnlockArea.lO
3c80: 66 66 73 65 74 20 3d 20 52 45 53 45 52 56 45 44  ffset = RESERVED
3c90: 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 55 6e 6c  _BYTE;.      Unl
3ca0: 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d  ockArea.lRange =
3cb0: 20 31 4c 3b 0a 20 20 20 20 20 20 72 63 75 20 3d   1L;.      rcu =
3cc0: 20 44 6f 73 53 65 74 46 69 6c 65 4c 6f 63 6b 73   DosSetFileLocks
3cd0: 28 20 70 46 69 6c 65 2d 3e 68 2c 20 26 55 6e 6c  ( pFile->h, &Unl
3ce0: 6f 63 6b 41 72 65 61 2c 20 26 4c 6f 63 6b 41 72  ockArea, &LockAr
3cf0: 65 61 2c 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54  ea, LOCK_TIMEOUT
3d00: 2c 20 30 4c 20 29 3b 0a 20 20 20 20 20 20 4f 53  , 0L );.      OS
3d10: 54 52 41 43 45 28 28 20 22 54 45 53 54 20 57 52  TRACE(( "TEST WR
3d20: 2d 4c 4f 43 4b 20 25 64 20 75 6e 6c 6f 63 6b 20  -LOCK %d unlock 
3d30: 72 65 73 65 72 76 65 64 20 62 79 74 65 20 72 3d  reserved byte r=
3d40: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
3d50: 20 72 63 75 20 29 29 3b 0a 20 20 20 20 7d 0a 20   rcu ));.    }. 
3d60: 20 20 20 72 20 3d 20 21 28 72 63 20 3d 3d 20 4e     r = !(rc == N
3d70: 4f 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 4f 53  O_ERROR);.    OS
3d80: 54 52 41 43 45 28 28 20 22 54 45 53 54 20 57 52  TRACE(( "TEST WR
3d90: 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 72 65 6d  -LOCK %d %d (rem
3da0: 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ote)\n", pFile->
3db0: 68 2c 20 72 20 29 29 3b 0a 20 20 7d 0a 20 20 2a  h, r ));.  }.  *
3dc0: 70 4f 75 74 20 3d 20 72 3b 0a 20 20 72 65 74 75  pOut = r;.  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 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
3df0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
3e00: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
3e10: 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65  r id to locktype
3e20: 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d  .  locktype.** m
3e30: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
3e40: 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
3e50: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
3e60: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
3e70: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
3e80: 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
3e90: 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
3ea0: 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
3eb0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
3ec0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
3ed0: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74   no-op..**.** It
3ee0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
3ef0: 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
3f00: 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65  e to fail if the
3f10: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
3f20: 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20  .** is NO_LOCK. 
3f30: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
3f40: 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45  rgument is SHARE
3f50: 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73  D_LOCK then this
3f60: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68   routine.** migh
3f70: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
3f80: 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63  IOERR;.*/.static
3f90: 20 69 6e 74 20 6f 73 32 55 6e 6c 6f 63 6b 28 20   int os2Unlock( 
3fa0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
3fb0: 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 20 29  , int locktype )
3fc0: 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20  {.  int type;.  
3fd0: 6f 73 32 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  os2File *pFile =
3fe0: 20 28 6f 73 32 46 69 6c 65 2a 29 69 64 3b 0a 20   (os2File*)id;. 
3ff0: 20 41 50 49 52 45 54 20 72 63 20 3d 20 53 51 4c   APIRET rc = SQL
4000: 49 54 45 5f 4f 4b 3b 0a 20 20 41 50 49 52 45 54  ITE_OK;.  APIRET
4010: 20 72 65 73 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b   res = NO_ERROR;
4020: 0a 20 20 46 49 4c 45 4c 4f 43 4b 20 20 4c 6f 63  .  FILELOCK  Loc
4030: 6b 41 72 65 61 2c 0a 20 20 20 20 20 20 20 20 20  kArea,.         
4040: 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 3b 0a 20     UnlockArea;. 
4050: 20 6d 65 6d 73 65 74 28 26 4c 6f 63 6b 41 72 65   memset(&LockAre
4060: 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 63  a, 0, sizeof(Loc
4070: 6b 41 72 65 61 29 29 3b 0a 20 20 6d 65 6d 73 65  kArea));.  memse
4080: 74 28 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 30  t(&UnlockArea, 0
4090: 2c 20 73 69 7a 65 6f 66 28 55 6e 6c 6f 63 6b 41  , sizeof(UnlockA
40a0: 72 65 61 29 29 3b 0a 20 20 61 73 73 65 72 74 28  rea));.  assert(
40b0: 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61   pFile!=0 );.  a
40c0: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
40d0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
40e0: 20 20 4f 53 54 52 41 43 45 28 28 20 22 55 4e 4c    OSTRACE(( "UNL
40f0: 4f 43 4b 20 25 64 20 74 6f 20 25 64 20 77 61 73  OCK %d to %d was
4100: 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
4110: 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c  , locktype, pFil
4120: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 29 3b 0a  e->locktype ));.
4130: 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e    type = pFile->
4140: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20  locktype;.  if( 
4150: 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f  type>=EXCLUSIVE_
4160: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 4c 6f 63 6b  LOCK ){.    Lock
4170: 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 30  Area.lOffset = 0
4180: 4c 3b 0a 20 20 20 20 4c 6f 63 6b 41 72 65 61 2e  L;.    LockArea.
4190: 6c 52 61 6e 67 65 20 3d 20 30 4c 3b 0a 20 20 20  lRange = 0L;.   
41a0: 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66   UnlockArea.lOff
41b0: 73 65 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  set = SHARED_FIR
41c0: 53 54 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72  ST;.    UnlockAr
41d0: 65 61 2e 6c 52 61 6e 67 65 20 3d 20 53 48 41 52  ea.lRange = SHAR
41e0: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 72 65 73  ED_SIZE;.    res
41f0: 20 3d 20 44 6f 73 53 65 74 46 69 6c 65 4c 6f 63   = DosSetFileLoc
4200: 6b 73 28 20 70 46 69 6c 65 2d 3e 68 2c 20 26 55  ks( pFile->h, &U
4210: 6e 6c 6f 63 6b 41 72 65 61 2c 20 26 4c 6f 63 6b  nlockArea, &Lock
4220: 41 72 65 61 2c 20 4c 4f 43 4b 5f 54 49 4d 45 4f  Area, LOCK_TIMEO
4230: 55 54 2c 20 30 4c 20 29 3b 0a 20 20 20 20 4f 53  UT, 0L );.    OS
4240: 54 52 41 43 45 28 28 20 22 55 4e 4c 4f 43 4b 20  TRACE(( "UNLOCK 
4250: 25 64 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  %d exclusive loc
4260: 6b 20 72 65 73 3d 25 64 5c 6e 22 2c 20 70 46 69  k res=%d\n", pFi
4270: 6c 65 2d 3e 68 2c 20 72 65 73 20 29 29 3b 0a 20  le->h, res ));. 
4280: 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d     if( locktype=
4290: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
42a0: 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  getReadLock(pFil
42b0: 65 29 20 21 3d 20 4e 4f 5f 45 52 52 4f 52 20 29  e) != NO_ERROR )
42c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
42d0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
42e0: 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20  pen.  We should 
42f0: 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20 74  always be able t
4300: 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71  o.      ** reacq
4310: 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
4320: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52  ck */.      OSTR
4330: 41 43 45 28 28 20 22 55 4e 4c 4f 43 4b 20 25 64  ACE(( "UNLOCK %d
4340: 20 74 6f 20 25 64 20 67 65 74 52 65 61 64 4c 6f   to %d getReadLo
4350: 63 6b 28 29 20 66 61 69 6c 65 64 5c 6e 22 2c 20  ck() failed\n", 
4360: 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
4370: 70 65 20 29 29 3b 0a 20 20 20 20 20 20 72 63 20  pe ));.      rc 
4380: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
4390: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  NLOCK;.    }.  }
43a0: 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53  .  if( type>=RES
43b0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
43c0: 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73    LockArea.lOffs
43d0: 65 74 20 3d 20 30 4c 3b 0a 20 20 20 20 4c 6f 63  et = 0L;.    Loc
43e0: 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20 30  kArea.lRange = 0
43f0: 4c 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65  L;.    UnlockAre
4400: 61 2e 6c 4f 66 66 73 65 74 20 3d 20 52 45 53 45  a.lOffset = RESE
4410: 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 55  RVED_BYTE;.    U
4420: 6e 6c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65  nlockArea.lRange
4430: 20 3d 20 31 4c 3b 0a 20 20 20 20 72 65 73 20 3d   = 1L;.    res =
4440: 20 44 6f 73 53 65 74 46 69 6c 65 4c 6f 63 6b 73   DosSetFileLocks
4450: 28 20 70 46 69 6c 65 2d 3e 68 2c 20 26 55 6e 6c  ( pFile->h, &Unl
4460: 6f 63 6b 41 72 65 61 2c 20 26 4c 6f 63 6b 41 72  ockArea, &LockAr
4470: 65 61 2c 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54  ea, LOCK_TIMEOUT
4480: 2c 20 30 4c 20 29 3b 0a 20 20 20 20 4f 53 54 52  , 0L );.    OSTR
4490: 41 43 45 28 28 20 22 55 4e 4c 4f 43 4b 20 25 64  ACE(( "UNLOCK %d
44a0: 20 72 65 73 65 72 76 65 64 20 72 65 73 3d 25 64   reserved res=%d
44b0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
44c0: 65 73 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  es ));.  }.  if(
44d0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
44e0: 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52  CK && type>=SHAR
44f0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
4500: 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61 64 4c  es = unlockReadL
4510: 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ock(pFile);.    
4520: 4f 53 54 52 41 43 45 28 28 20 22 55 4e 4c 4f 43  OSTRACE(( "UNLOC
4530: 4b 20 25 64 20 69 73 20 25 64 20 77 61 6e 74 20  K %d is %d want 
4540: 25 64 20 72 65 73 3d 25 64 5c 6e 22 2c 0a 20 20  %d res=%d\n",.  
4550: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
4560: 65 2d 3e 68 2c 20 74 79 70 65 2c 20 6c 6f 63 6b  e->h, type, lock
4570: 74 79 70 65 2c 20 72 65 73 20 29 29 3b 0a 20 20  type, res ));.  
4580: 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45  }.  if( type>=PE
4590: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
45a0: 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73    LockArea.lOffs
45b0: 65 74 20 3d 20 30 4c 3b 0a 20 20 20 20 4c 6f 63  et = 0L;.    Loc
45c0: 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20 30  kArea.lRange = 0
45d0: 4c 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65  L;.    UnlockAre
45e0: 61 2e 6c 4f 66 66 73 65 74 20 3d 20 50 45 4e 44  a.lOffset = PEND
45f0: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 55 6e  ING_BYTE;.    Un
4600: 6c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20  lockArea.lRange 
4610: 3d 20 31 4c 3b 0a 20 20 20 20 72 65 73 20 3d 20  = 1L;.    res = 
4620: 44 6f 73 53 65 74 46 69 6c 65 4c 6f 63 6b 73 28  DosSetFileLocks(
4630: 20 70 46 69 6c 65 2d 3e 68 2c 20 26 55 6e 6c 6f   pFile->h, &Unlo
4640: 63 6b 41 72 65 61 2c 20 26 4c 6f 63 6b 41 72 65  ckArea, &LockAre
4650: 61 2c 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c  a, LOCK_TIMEOUT,
4660: 20 30 4c 20 29 3b 0a 20 20 20 20 4f 53 54 52 41   0L );.    OSTRA
4670: 43 45 28 28 20 22 55 4e 4c 4f 43 4b 20 25 64 20  CE(( "UNLOCK %d 
4680: 70 65 6e 64 69 6e 67 20 72 65 73 3d 25 64 5c 6e  pending res=%d\n
4690: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73  ", pFile->h, res
46a0: 20 29 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65   ));.  }.  pFile
46b0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
46c0: 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45  ktype;.  OSTRACE
46d0: 28 28 20 22 55 4e 4c 4f 43 4b 20 25 64 20 6e 6f  (( "UNLOCK %d no
46e0: 77 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  w %d\n", pFile->
46f0: 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
4700: 70 65 20 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  pe ));.  return 
4710: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  rc;.}../*.** Con
4720: 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f  trol and query o
4730: 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  f the open file 
4740: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
4750: 63 20 69 6e 74 20 6f 73 32 46 69 6c 65 43 6f 6e  c int os2FileCon
4760: 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
4770: 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
4780: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77  oid *pArg){.  sw
4790: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
47a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
47b0: 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
47c0: 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
47d0: 20 3d 20 28 28 6f 73 32 46 69 6c 65 2a 29 69 64   = ((os2File*)id
47e0: 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20  )->locktype;.   
47f0: 20 20 20 4f 53 54 52 41 43 45 28 28 20 22 46 43     OSTRACE(( "FC
4800: 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 20 25 64  NTL_LOCKSTATE %d
4810: 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20   lock=%d\n",.   
4820: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 6f               ((o
4830: 73 32 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  s2File*)id)->h, 
4840: 28 28 6f 73 32 46 69 6c 65 2a 29 69 64 29 2d 3e  ((os2File*)id)->
4850: 6c 6f 63 6b 74 79 70 65 20 29 29 3b 0a 20 20 20  locktype ));.   
4860: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4870: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
4880: 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
4890: 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20  _CHUNK_SIZE: {. 
48a0: 20 20 20 20 20 28 28 6f 73 32 46 69 6c 65 2a 29       ((os2File*)
48b0: 69 64 29 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a  id)->szChunk = *
48c0: 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20  (int*)pArg;.    
48d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
48e0: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
48f0: 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
4900: 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20  SIZE_HINT: {.   
4910: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
4920: 20 73 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f   sz = *(sqlite3_
4930: 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20  int64*)pArg;.   
4940: 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
4950: 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
4960: 20 20 20 6f 73 32 54 72 75 6e 63 61 74 65 28 69     os2Truncate(i
4970: 64 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 53 69  d, sz);.      Si
4980: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
4990: 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 72 65  ign(0);.      re
49a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
49b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
49c0: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43  QLITE_FCNTL_SYNC
49d0: 5f 4f 4d 49 54 54 45 44 3a 20 7b 0a 20 20 20 20  _OMITTED: {.    
49e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
49f0: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
4a00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
4a10: 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TFOUND;.}../*.**
4a20: 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74   Return the sect
4a30: 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  or size in bytes
4a40: 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
4a50: 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20  ng block device 
4a60: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69  for.** the speci
4a70: 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20  fied file. This 
4a80: 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  is almost always
4a90: 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20   512 bytes, but 
4aa0: 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72  may be.** larger
4ab0: 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65   for some device
4ac0: 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
4ad0: 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69  code assumes thi
4ae0: 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  s function canno
4af0: 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20  t fail. It also 
4b00: 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20  assumes that.** 
4b10: 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65  if two files are
4b20: 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
4b30: 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d  same file-system
4b40: 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
4b50: 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
4b60: 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66  nd its journal f
4b70: 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65  ile) that the se
4b80: 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
4b90: 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f  e the.** same fo
4ba0: 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
4bb0: 63 20 69 6e 74 20 6f 73 32 53 65 63 74 6f 72 53  c int os2SectorS
4bc0: 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
4bd0: 20 2a 69 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f   *id){.  UNUSED_
4be0: 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 20  PARAMETER(id);. 
4bf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
4c00: 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
4c10: 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ZE;.}../*.** Ret
4c20: 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20  urn a vector of 
4c30: 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
4c40: 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69  istics..*/.stati
4c50: 63 20 69 6e 74 20 6f 73 32 44 65 76 69 63 65 43  c int os2DeviceC
4c60: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
4c70: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
4c80: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
4c90: 45 54 45 52 28 69 64 29 3b 0a 20 20 72 65 74 75  ETER(id);.  retu
4ca0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rn SQLITE_IOCAP_
4cb0: 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
4cc0: 5f 4f 50 45 4e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  _OPEN;.}.../*.**
4cd0: 20 43 68 61 72 61 63 74 65 72 20 73 65 74 20 63   Character set c
4ce0: 6f 6e 76 65 72 73 69 6f 6e 20 6f 62 6a 65 63 74  onversion object
4cf0: 73 20 75 73 65 64 20 62 79 20 63 6f 6e 76 65 72  s used by conver
4d00: 73 69 6f 6e 20 72 6f 75 74 69 6e 65 73 2e 0a 2a  sion routines..*
4d10: 2f 0a 73 74 61 74 69 63 20 55 63 6f 6e 76 4f 62  /.static UconvOb
4d20: 6a 65 63 74 20 75 63 55 74 66 38 20 3d 20 4e 55  ject ucUtf8 = NU
4d30: 4c 4c 3b 20 2f 2a 20 63 6f 6e 76 65 72 74 20 62  LL; /* convert b
4d40: 65 74 77 65 65 6e 20 55 54 46 2d 38 20 61 6e 64  etween UTF-8 and
4d50: 20 55 43 53 2d 32 20 2a 2f 0a 73 74 61 74 69 63   UCS-2 */.static
4d60: 20 55 63 6f 6e 76 4f 62 6a 65 63 74 20 75 63 6c   UconvObject ucl
4d70: 43 70 20 3d 20 4e 55 4c 4c 3b 20 20 2f 2a 20 63  Cp = NULL;  /* c
4d80: 6f 6e 76 65 72 74 20 62 65 74 77 65 65 6e 20 6c  onvert between l
4d90: 6f 63 61 6c 20 63 6f 64 65 70 61 67 65 20 61 6e  ocal codepage an
4da0: 64 20 55 43 53 2d 32 20 2a 2f 0a 0a 2f 2a 0a 2a  d UCS-2 */../*.*
4db0: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
4dc0: 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  n to initialize 
4dd0: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 6f  the conversion o
4de0: 62 6a 65 63 74 73 20 66 72 6f 6d 20 61 6e 64 20  bjects from and 
4df0: 74 6f 20 55 54 46 2d 38 2e 0a 2a 2f 0a 73 74 61  to UTF-8..*/.sta
4e00: 74 69 63 20 76 6f 69 64 20 69 6e 69 74 55 63 6f  tic void initUco
4e10: 6e 76 4f 62 6a 65 63 74 73 28 20 76 6f 69 64 20  nvObjects( void 
4e20: 29 7b 0a 20 20 69 66 28 20 55 6e 69 43 72 65 61  ){.  if( UniCrea
4e30: 74 65 55 63 6f 6e 76 4f 62 6a 65 63 74 28 20 55  teUconvObject( U
4e40: 54 46 5f 38 2c 20 26 75 63 55 74 66 38 20 29 20  TF_8, &ucUtf8 ) 
4e50: 21 3d 20 55 4c 53 5f 53 55 43 43 45 53 53 20 29  != ULS_SUCCESS )
4e60: 0a 20 20 20 20 75 63 55 74 66 38 20 3d 20 4e 55  .    ucUtf8 = NU
4e70: 4c 4c 3b 0a 20 20 69 66 20 28 20 55 6e 69 43 72  LL;.  if ( UniCr
4e80: 65 61 74 65 55 63 6f 6e 76 4f 62 6a 65 63 74 28  eateUconvObject(
4e90: 20 28 55 6e 69 43 68 61 72 20 2a 29 4c 22 40 70   (UniChar *)L"@p
4ea0: 61 74 68 3d 79 65 73 22 2c 20 26 75 63 6c 43 70  ath=yes", &uclCp
4eb0: 20 29 20 21 3d 20 55 4c 53 5f 53 55 43 43 45 53   ) != ULS_SUCCES
4ec0: 53 20 29 0a 20 20 20 20 75 63 6c 43 70 20 3d 20  S ).    uclCp = 
4ed0: 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  NULL;.}../*.** H
4ee0: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 74  elper function t
4ef0: 6f 20 66 72 65 65 20 74 68 65 20 63 6f 6e 76 65  o free the conve
4f00: 72 73 69 6f 6e 20 6f 62 6a 65 63 74 73 20 66 72  rsion objects fr
4f10: 6f 6d 20 61 6e 64 20 74 6f 20 55 54 46 2d 38 2e  om and to UTF-8.
4f20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4f30: 66 72 65 65 55 63 6f 6e 76 4f 62 6a 65 63 74 73  freeUconvObjects
4f40: 28 20 76 6f 69 64 20 29 7b 0a 20 20 69 66 20 28  ( void ){.  if (
4f50: 20 75 63 55 74 66 38 20 29 0a 20 20 20 20 55 6e   ucUtf8 ).    Un
4f60: 69 46 72 65 65 55 63 6f 6e 76 4f 62 6a 65 63 74  iFreeUconvObject
4f70: 28 20 75 63 55 74 66 38 20 29 3b 0a 20 20 69 66  ( ucUtf8 );.  if
4f80: 20 28 20 75 63 6c 43 70 20 29 0a 20 20 20 20 55   ( uclCp ).    U
4f90: 6e 69 46 72 65 65 55 63 6f 6e 76 4f 62 6a 65 63  niFreeUconvObjec
4fa0: 74 28 20 75 63 6c 43 70 20 29 3b 0a 20 20 75 63  t( uclCp );.  uc
4fb0: 55 74 66 38 20 3d 20 4e 55 4c 4c 3b 0a 20 20 75  Utf8 = NULL;.  u
4fc0: 63 6c 43 70 20 3d 20 4e 55 4c 4c 3b 0a 7d 0a 0a  clCp = NULL;.}..
4fd0: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
4fe0: 63 74 69 6f 6e 20 74 6f 20 63 6f 6e 76 65 72 74  ction to convert
4ff0: 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 73   UTF-8 filenames
5000: 20 74 6f 20 6c 6f 63 61 6c 20 4f 53 2f 32 20 63   to local OS/2 c
5010: 6f 64 65 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20  odepage..** The 
5020: 74 77 6f 2d 73 74 65 70 20 70 72 6f 63 65 73 73  two-step process
5030: 3a 20 66 69 72 73 74 20 63 6f 6e 76 65 72 74 20  : first convert 
5040: 74 68 65 20 69 6e 63 6f 6d 69 6e 67 20 55 54 46  the incoming UTF
5050: 2d 38 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 74  -8 string.** int
5060: 6f 20 55 43 53 2d 32 20 61 6e 64 20 74 68 65 6e  o UCS-2 and then
5070: 20 66 72 6f 6d 20 55 43 53 2d 32 20 74 6f 20 74   from UCS-2 to t
5080: 68 65 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70  he current codep
5090: 61 67 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  age..** The retu
50a0: 72 6e 65 64 20 63 68 61 72 20 70 6f 69 6e 74 65  rned char pointe
50b0: 72 20 68 61 73 20 74 6f 20 62 65 20 66 72 65 65  r has to be free
50c0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  d..*/.static cha
50d0: 72 20 2a 63 6f 6e 76 65 72 74 55 74 66 38 50 61  r *convertUtf8Pa
50e0: 74 68 54 6f 43 70 28 20 63 6f 6e 73 74 20 63 68  thToCp( const ch
50f0: 61 72 20 2a 69 6e 20 29 7b 0a 20 20 55 6e 69 43  ar *in ){.  UniC
5100: 68 61 72 20 74 65 6d 70 50 61 74 68 5b 43 43 48  har tempPath[CCH
5110: 4d 41 58 50 41 54 48 5d 3b 0a 20 20 63 68 61 72  MAXPATH];.  char
5120: 20 2a 6f 75 74 20 3d 20 28 63 68 61 72 20 2a 29   *out = (char *)
5130: 63 61 6c 6c 6f 63 28 20 43 43 48 4d 41 58 50 41  calloc( CCHMAXPA
5140: 54 48 2c 20 31 20 29 3b 0a 0a 20 20 69 66 28 20  TH, 1 );..  if( 
5150: 21 6f 75 74 20 29 0a 20 20 20 20 72 65 74 75 72  !out ).    retur
5160: 6e 20 4e 55 4c 4c 3b 0a 0a 20 20 69 66 28 20 21  n NULL;..  if( !
5170: 75 63 55 74 66 38 20 7c 7c 20 21 75 63 6c 43 70  ucUtf8 || !uclCp
5180: 20 29 0a 20 20 20 20 69 6e 69 74 55 63 6f 6e 76   ).    initUconv
5190: 4f 62 6a 65 63 74 73 28 29 3b 0a 0a 20 20 2f 2a  Objects();..  /*
51a0: 20 64 65 74 65 72 6d 69 6e 65 20 73 74 72 69 6e   determine strin
51b0: 67 20 66 6f 72 20 74 68 65 20 63 6f 6e 76 65 72  g for the conver
51c0: 73 69 6f 6e 20 6f 66 20 55 54 46 2d 38 20 77 68  sion of UTF-8 wh
51d0: 69 63 68 20 69 73 20 43 50 31 32 30 38 20 2a 2f  ich is CP1208 */
51e0: 0a 20 20 69 66 28 20 55 6e 69 53 74 72 54 6f 55  .  if( UniStrToU
51f0: 63 73 28 20 75 63 55 74 66 38 2c 20 74 65 6d 70  cs( ucUtf8, temp
5200: 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29 69 6e  Path, (char *)in
5210: 2c 20 43 43 48 4d 41 58 50 41 54 48 20 29 20 21  , CCHMAXPATH ) !
5220: 3d 20 55 4c 53 5f 53 55 43 43 45 53 53 20 29 0a  = ULS_SUCCESS ).
5230: 20 20 20 20 72 65 74 75 72 6e 20 6f 75 74 3b 20      return out; 
5240: 2f 2a 20 69 66 20 63 6f 6e 76 65 72 73 69 6f 6e  /* if conversion
5250: 20 66 61 69 6c 73 2c 20 72 65 74 75 72 6e 20 74   fails, return t
5260: 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  he empty string 
5270: 2a 2f 0a 0a 20 20 2f 2a 20 63 6f 6e 76 65 72 73  */..  /* convers
5280: 69 6f 6e 20 66 6f 72 20 63 75 72 72 65 6e 74 20  ion for current 
5290: 63 6f 64 65 70 61 67 65 20 77 68 69 63 68 20 63  codepage which c
52a0: 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 70  an be used for p
52b0: 61 74 68 73 20 2a 2f 0a 20 20 55 6e 69 53 74 72  aths */.  UniStr
52c0: 46 72 6f 6d 55 63 73 28 20 75 63 6c 43 70 2c 20  FromUcs( uclCp, 
52d0: 6f 75 74 2c 20 74 65 6d 70 50 61 74 68 2c 20 43  out, tempPath, C
52e0: 43 48 4d 41 58 50 41 54 48 20 29 3b 0a 0a 20 20  CHMAXPATH );..  
52f0: 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f  return out;.}../
5300: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
5310: 74 69 6f 6e 20 74 6f 20 63 6f 6e 76 65 72 74 20  tion to convert 
5320: 66 69 6c 65 6e 61 6d 65 73 20 66 72 6f 6d 20 6c  filenames from l
5330: 6f 63 61 6c 20 63 6f 64 65 70 61 67 65 20 74 6f  ocal codepage to
5340: 20 55 54 46 2d 38 2e 0a 2a 2a 20 54 68 65 20 74   UTF-8..** The t
5350: 77 6f 2d 73 74 65 70 20 70 72 6f 63 65 73 73 3a  wo-step process:
5360: 20 66 69 72 73 74 20 63 6f 6e 76 65 72 74 20 74   first convert t
5370: 68 65 20 69 6e 63 6f 6d 69 6e 67 20 63 6f 64 65  he incoming code
5380: 70 61 67 65 2d 73 70 65 63 69 66 69 63 0a 2a 2a  page-specific.**
5390: 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 55 43 53   string into UCS
53a0: 2d 32 20 61 6e 64 20 74 68 65 6e 20 66 72 6f 6d  -2 and then from
53b0: 20 55 43 53 2d 32 20 74 6f 20 74 68 65 20 63 6f   UCS-2 to the co
53c0: 64 65 70 61 67 65 20 6f 66 20 55 54 46 2d 38 2e  depage of UTF-8.
53d0: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
53e0: 20 63 68 61 72 20 70 6f 69 6e 74 65 72 20 68 61   char pointer ha
53f0: 73 20 74 6f 20 62 65 20 66 72 65 65 64 2e 0a 2a  s to be freed..*
5400: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
5410: 6f 6e 20 69 73 20 6e 6f 6e 2d 73 74 61 74 69 63  on is non-static
5420: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 75   to be able to u
5430: 73 65 20 74 68 69 73 20 69 6e 20 73 68 65 6c 6c  se this in shell
5440: 2e 63 20 61 6e 64 0a 2a 2a 20 73 69 6d 69 6c 61  .c and.** simila
5450: 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74  r applications t
5460: 68 61 74 20 74 61 6b 65 20 63 6f 6d 6d 61 6e 64  hat take command
5470: 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 2e   line arguments.
5480: 0a 2a 2f 0a 63 68 61 72 20 2a 63 6f 6e 76 65 72  .*/.char *conver
5490: 74 43 70 50 61 74 68 54 6f 55 74 66 38 28 20 63  tCpPathToUtf8( c
54a0: 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 20 29 7b  onst char *in ){
54b0: 0a 20 20 55 6e 69 43 68 61 72 20 74 65 6d 70 50  .  UniChar tempP
54c0: 61 74 68 5b 43 43 48 4d 41 58 50 41 54 48 5d 3b  ath[CCHMAXPATH];
54d0: 0a 20 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 28  .  char *out = (
54e0: 63 68 61 72 20 2a 29 63 61 6c 6c 6f 63 28 20 43  char *)calloc( C
54f0: 43 48 4d 41 58 50 41 54 48 2c 20 31 20 29 3b 0a  CHMAXPATH, 1 );.
5500: 0a 20 20 69 66 28 20 21 6f 75 74 20 29 0a 20 20  .  if( !out ).  
5510: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 0a    return NULL;..
5520: 20 20 69 66 28 20 21 75 63 55 74 66 38 20 7c 7c    if( !ucUtf8 ||
5530: 20 21 75 63 6c 43 70 20 29 0a 20 20 20 20 69 6e   !uclCp ).    in
5540: 69 74 55 63 6f 6e 76 4f 62 6a 65 63 74 73 28 29  itUconvObjects()
5550: 3b 0a 0a 20 20 2f 2a 20 63 6f 6e 76 65 72 73 69  ;..  /* conversi
5560: 6f 6e 20 66 6f 72 20 63 75 72 72 65 6e 74 20 63  on for current c
5570: 6f 64 65 70 61 67 65 20 77 68 69 63 68 20 63 61  odepage which ca
5580: 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 70 61  n be used for pa
5590: 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 55 6e 69  ths */.  if( Uni
55a0: 53 74 72 54 6f 55 63 73 28 20 75 63 6c 43 70 2c  StrToUcs( uclCp,
55b0: 20 74 65 6d 70 50 61 74 68 2c 20 28 63 68 61 72   tempPath, (char
55c0: 20 2a 29 69 6e 2c 20 43 43 48 4d 41 58 50 41 54   *)in, CCHMAXPAT
55d0: 48 20 29 20 21 3d 20 55 4c 53 5f 53 55 43 43 45  H ) != ULS_SUCCE
55e0: 53 53 20 29 0a 20 20 20 20 72 65 74 75 72 6e 20  SS ).    return 
55f0: 6f 75 74 3b 20 2f 2a 20 69 66 20 63 6f 6e 76 65  out; /* if conve
5600: 72 73 69 6f 6e 20 66 61 69 6c 73 2c 20 72 65 74  rsion fails, ret
5610: 75 72 6e 20 74 68 65 20 65 6d 70 74 79 20 73 74  urn the empty st
5620: 72 69 6e 67 20 2a 2f 0a 0a 20 20 2f 2a 20 64 65  ring */..  /* de
5630: 74 65 72 6d 69 6e 65 20 73 74 72 69 6e 67 20 66  termine string f
5640: 6f 72 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  or the conversio
5650: 6e 20 6f 66 20 55 54 46 2d 38 20 77 68 69 63 68  n of UTF-8 which
5660: 20 69 73 20 43 50 31 32 30 38 20 2a 2f 0a 20 20   is CP1208 */.  
5670: 55 6e 69 53 74 72 46 72 6f 6d 55 63 73 28 20 75  UniStrFromUcs( u
5680: 63 55 74 66 38 2c 20 6f 75 74 2c 20 74 65 6d 70  cUtf8, out, temp
5690: 50 61 74 68 2c 20 43 43 48 4d 41 58 50 41 54 48  Path, CCHMAXPATH
56a0: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 6f 75   );..  return ou
56b0: 74 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  t;.}...#ifndef S
56c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
56d0: 2f 2a 0a 2a 2a 20 55 73 65 20 6d 61 69 6e 20 64  /*.** Use main d
56e0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
56f0: 20 69 6e 74 65 72 70 72 6f 63 65 73 73 20 6c 6f   interprocess lo
5700: 63 6b 69 6e 67 2e 20 49 66 20 75 6e 2d 64 65 66  cking. If un-def
5710: 69 6e 65 64 0a 2a 2a 20 61 20 73 65 70 61 72 61  ined.** a separa
5720: 74 65 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  te file is creat
5730: 65 64 20 66 6f 72 20 74 68 69 73 20 70 75 72 70  ed for this purp
5740: 6f 73 65 2e 20 54 68 65 20 66 69 6c 65 20 77 69  ose. The file wi
5750: 6c 6c 20 62 65 0a 2a 2a 20 75 73 65 64 20 6f 6e  ll be.** used on
5760: 6c 79 20 74 6f 20 73 65 74 20 66 69 6c 65 20 6c  ly to set file l
5770: 6f 63 6b 73 2e 20 54 68 65 72 65 20 77 69 6c 6c  ocks. There will
5780: 20 62 65 20 6e 6f 20 64 61 74 61 20 77 72 69 74   be no data writ
5790: 74 65 6e 20 74 6f 20 69 74 2e 0a 2a 2f 0a 23 64  ten to it..*/.#d
57a0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4f 53 32  efine SQLITE_OS2
57b0: 5f 4e 4f 5f 57 41 4c 5f 4c 4f 43 4b 5f 46 49 4c  _NO_WAL_LOCK_FIL
57c0: 45 20 20 20 20 20 0a 0a 23 69 66 20 30 0a 73 74  E     ..#if 0.st
57d0: 61 74 69 63 20 76 6f 69 64 20 5f 45 52 52 5f 54  atic void _ERR_T
57e0: 52 41 43 45 28 20 63 6f 6e 73 74 20 63 68 61 72  RACE( const char
57f0: 20 2a 66 6d 74 2c 20 2e 2e 2e 20 29 20 7b 0a 20   *fmt, ... ) {. 
5800: 20 76 61 5f 6c 69 73 74 20 20 61 70 3b 0a 20 20   va_list  ap;.  
5810: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 66 6d 74  va_start(ap, fmt
5820: 29 3b 0a 20 20 76 66 70 72 69 6e 74 66 28 73 74  );.  vfprintf(st
5830: 64 65 72 72 2c 20 66 6d 74 2c 20 61 70 29 3b 0a  derr, fmt, ap);.
5840: 20 20 66 66 6c 75 73 68 28 73 74 64 65 72 72 29    fflush(stderr)
5850: 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 45 52 52 5f  ;.}.#define ERR_
5860: 54 52 41 43 45 28 72 63 2c 20 6d 73 67 29 20 20  TRACE(rc, msg)  
5870: 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20 20        \.        
5880: 69 66 28 20 28 72 63 29 20 21 3d 20 53 51 4c 49  if( (rc) != SQLI
5890: 54 45 5f 4f 4b 20 29 20 5f 45 52 52 5f 54 52 41  TE_OK ) _ERR_TRA
58a0: 43 45 20 6d 73 67 3b 0a 23 65 6c 73 65 0a 23 64  CE msg;.#else.#d
58b0: 65 66 69 6e 65 20 45 52 52 5f 54 52 41 43 45 28  efine ERR_TRACE(
58c0: 72 63 2c 20 6d 73 67 29 0a 23 65 6e 64 69 66 0a  rc, msg).#endif.
58d0: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
58e0: 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69  nctions to obtai
58f0: 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68  n and relinquish
5900: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
5910: 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c  x. The.** global
5920: 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74   mutex is used t
5930: 6f 20 70 72 6f 74 65 63 74 20 6f 73 32 53 68 6d  o protect os2Shm
5940: 4e 6f 64 65 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  NodeList..**.** 
5950: 46 75 6e 63 74 69 6f 6e 20 6f 73 32 53 68 6d 4d  Function os2ShmM
5960: 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73  utexHeld() is us
5970: 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  ed to assert() t
5980: 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  hat the global m
5990: 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64  utex .** is held
59a0: 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20   when required. 
59b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
59c0: 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
59d0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a  rt of assert() .
59e0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65  ** statements. e
59f0: 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 6f 73 32 53  .g..**.**   os2S
5a00: 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a  hmEnterMutex().*
5a10: 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 73  *     assert( os
5a20: 32 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  2ShmMutexHeld() 
5a30: 29 3b 0a 2a 2a 20 20 20 6f 73 32 53 68 6d 4c 65  );.**   os2ShmLe
5a40: 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74  aveMutex().*/.st
5a50: 61 74 69 63 20 76 6f 69 64 20 6f 73 32 53 68 6d  atic void os2Shm
5a60: 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29  EnterMutex(void)
5a70: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
5a80: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d  x_enter(sqlite3M
5a90: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
5aa0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
5ab0: 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63  STER));.}.static
5ac0: 20 76 6f 69 64 20 6f 73 32 53 68 6d 4c 65 61 76   void os2ShmLeav
5ad0: 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  eMutex(void){.  
5ae0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
5af0: 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ave(sqlite3Mutex
5b00: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
5b10: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
5b20: 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c  ));.}.#ifdef SQL
5b30: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
5b40: 20 69 6e 74 20 6f 73 32 53 68 6d 4d 75 74 65 78   int os2ShmMutex
5b50: 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72  Held(void) {.  r
5b60: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
5b70: 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33  tex_held(sqlite3
5b80: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
5b90: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
5ba0: 41 53 54 45 52 29 29 3b 0a 7d 0a 69 6e 74 20 47  ASTER));.}.int G
5bb0: 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
5bc0: 49 64 28 76 6f 69 64 29 20 7b 0a 20 20 50 50 49  Id(void) {.  PPI
5bd0: 42 20 70 69 62 3b 0a 20 20 44 6f 73 47 65 74 49  B pib;.  DosGetI
5be0: 6e 66 6f 42 6c 6f 63 6b 73 28 4e 55 4c 4c 2c 20  nfoBlocks(NULL, 
5bf0: 26 70 69 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  &pib);.  return 
5c00: 28 69 6e 74 29 70 69 62 2d 3e 70 69 62 5f 75 6c  (int)pib->pib_ul
5c10: 70 69 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  pid;.}.#endif../
5c20: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64  *.** Object used
5c30: 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
5c40: 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
5c50: 79 20 61 72 65 61 20 66 6f 72 20 61 20 73 69 6e  y area for a sin
5c60: 67 6c 65 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a  gle log file..**
5c70: 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74   When multiple t
5c80: 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72  hreads all refer
5c90: 65 6e 63 65 20 74 68 65 20 73 61 6d 65 20 6c 6f  ence the same lo
5ca0: 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20  g-summary, each 
5cb0: 74 68 72 65 61 64 20 68 61 73 0a 2a 2a 20 69 74  thread has.** it
5cc0: 73 20 6f 77 6e 20 6f 73 32 46 69 6c 65 20 6f 62  s own os2File ob
5cd0: 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61  ject, but they a
5ce0: 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  ll point to a si
5cf0: 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66  ngle instance of
5d00: 20 74 68 69 73 20 0a 2a 2a 20 6f 62 6a 65 63 74   this .** object
5d10: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
5d20: 73 2c 20 65 61 63 68 20 6c 6f 67 2d 73 75 6d 6d  s, each log-summ
5d30: 61 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ary is opened on
5d40: 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
5d50: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 6f 73 32 53 68  ess..**.** os2Sh
5d60: 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73  mMutexHeld() mus
5d70: 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63  t be true when c
5d80: 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72  reating or destr
5d90: 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62  oying.** this ob
5da0: 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65  ject or while re
5db0: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
5dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
5dd0: 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ields:.**.**    
5de0: 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20 70    nRef.**      p
5df0: 4e 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Next .**.** The 
5e00: 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
5e10: 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61   are read-only a
5e20: 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20  fter the object 
5e30: 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a  is created:.** .
5e40: 2a 2a 20 20 20 20 20 20 73 7a 52 65 67 69 6f 6e  **      szRegion
5e50: 0a 2a 2a 20 20 20 20 20 20 68 4c 6f 63 6b 46 69  .**      hLockFi
5e60: 6c 65 0a 2a 2a 20 20 20 20 20 20 73 68 6d 42 61  le.**      shmBa
5e70: 73 65 4e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  seName.**.** Eit
5e80: 68 65 72 20 6f 73 32 53 68 6d 4e 6f 64 65 2e 6d  her os2ShmNode.m
5e90: 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
5ea0: 64 20 6f 72 20 6f 73 32 53 68 6d 4e 6f 64 65 2e  d or os2ShmNode.
5eb0: 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 6f  nRef==0 and.** o
5ec0: 73 32 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  s2ShmMutexHeld()
5ed0: 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
5ee0: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
5ef0: 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
5f00: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
5f10: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72  cture..**.*/.str
5f20: 75 63 74 20 6f 73 32 53 68 6d 4e 6f 64 65 20 7b  uct os2ShmNode {
5f30: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
5f40: 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a   *mutex;      /*
5f50: 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73   Mutex to access
5f60: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
5f70: 20 20 6f 73 32 53 68 6d 4e 6f 64 65 20 2a 70 4e    os2ShmNode *pN
5f80: 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ext;         /* 
5f90: 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20  Next in list of 
5fa0: 61 6c 6c 20 6f 73 32 53 68 6d 4e 6f 64 65 20 6f  all os2ShmNode o
5fb0: 62 6a 65 63 74 73 20 2a 2f 0a 0a 20 20 69 6e 74  bjects */..  int
5fc0: 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
5fd0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
5fe0: 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
5ff0: 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69   regions */..  i
6000: 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20  nt nRegion;     
6010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
6020: 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67  e of array apReg
6030: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a  ion */.  void **
6040: 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  apRegion;       
6050: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
6060: 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 68 61 72  pointers to shar
6070: 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
6080: 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66  s */..  int nRef
6090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
60a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
60b0: 6f 73 32 53 68 6d 4c 69 6e 6b 20 6f 62 6a 65 63  os2ShmLink objec
60c0: 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
60d0: 68 69 73 20 2a 2f 0a 20 20 6f 73 32 53 68 6d 4c  his */.  os2ShmL
60e0: 69 6e 6b 20 2a 70 46 69 72 73 74 3b 20 20 20 20  ink *pFirst;    
60f0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 73 32      /* First os2
6100: 53 68 6d 4c 69 6e 6b 20 6f 62 6a 65 63 74 20 70  ShmLink object p
6110: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
6120: 2a 2f 0a 0a 20 20 48 46 49 4c 45 20 68 4c 6f 63  */..  HFILE hLoc
6130: 6b 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  kFile;          
6140: 20 2f 2a 20 46 69 6c 65 20 75 73 65 64 20 66 6f   /* File used fo
6150: 72 20 69 6e 74 65 72 2d 70 72 6f 63 65 73 73 20  r inter-process 
6160: 6d 65 6d 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 2a  memory locking *
6170: 2f 0a 20 20 63 68 61 72 20 73 68 6d 42 61 73 65  /.  char shmBase
6180: 4e 61 6d 65 5b 31 5d 3b 20 20 20 20 20 20 20 2f  Name[1];       /
6190: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 65  * Name of the me
61a0: 6d 6f 72 79 20 6f 62 6a 65 63 74 20 21 21 21 20  mory object !!! 
61b0: 6d 75 73 74 20 6c 61 73 74 20 21 21 21 20 2a 2f  must last !!! */
61c0: 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75  .};.../*.** Stru
61d0: 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72  cture used inter
61e0: 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46  nally by this VF
61f0: 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  S to record the 
6200: 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f  state of an.** o
6210: 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  pen shared memor
6220: 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  y connection..**
6230: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
6240: 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69  g fields are ini
6250: 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68  tialized when th
6260: 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  is object is cre
6270: 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20  ated and.** are 
6280: 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61  read-only therea
6290: 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  fter:.**.**    o
62a0: 73 32 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a  s2Shm.pShmNode.*
62b0: 2a 20 20 20 20 6f 73 32 53 68 6d 2e 69 64 0a 2a  *    os2Shm.id.*
62c0: 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66  *.** All other f
62d0: 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77  ields are read/w
62e0: 72 69 74 65 2e 20 20 54 68 65 20 6f 73 32 53 68  rite.  The os2Sh
62f0: 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  m.pShmNode->mute
6300: 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
6310: 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
6320: 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
6330: 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
6340: 63 74 20 6f 73 32 53 68 6d 4c 69 6e 6b 20 7b 0a  ct os2ShmLink {.
6350: 20 20 6f 73 32 53 68 6d 4e 6f 64 65 20 2a 70 53    os2ShmNode *pS
6360: 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20  hmNode;      /* 
6370: 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  The underlying o
6380: 73 32 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  s2ShmNode object
6390: 20 2a 2f 0a 20 20 6f 73 32 53 68 6d 4c 69 6e 6b   */.  os2ShmLink
63a0: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
63b0: 20 2f 2a 20 4e 65 78 74 20 6f 73 32 53 68 6d 20   /* Next os2Shm 
63c0: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6f 73  with the same os
63d0: 32 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 33  2ShmNode */.  u3
63e0: 32 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  2 sharedMask;   
63f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
6400: 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73   of shared locks
6410: 20 68 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 65   held */.  u32 e
6420: 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
6430: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
6440: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
6450: 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20   held */.#ifdef 
6460: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
6470: 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  8 id;           
6480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20            /* Id 
6490: 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
64a0: 6f 6e 20 77 69 74 68 20 69 74 73 20 6f 73 32 53  on with its os2S
64b0: 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66  hmNode */.#endif
64c0: 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c  .};.../*.** A gl
64d0: 6f 62 61 6c 20 6c 69 73 74 20 6f 66 20 61 6c 6c  obal list of all
64e0: 20 6f 73 32 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   os2ShmNode obje
64f0: 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  cts..**.** The o
6500: 73 32 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  s2ShmMutexHeld()
6510: 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68   must be true wh
6520: 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77  ile reading or w
6530: 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69 73 74  riting this list
6540: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 6f 73 32 53  ..*/.static os2S
6550: 68 6d 4e 6f 64 65 20 2a 6f 73 32 53 68 6d 4e 6f  hmNode *os2ShmNo
6560: 64 65 4c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 0a  deList = NULL;..
6570: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20  /*.** Constants 
6580: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
6590: 0a 2a 2f 0a 23 69 66 64 65 66 20 20 53 51 4c 49  .*/.#ifdef  SQLI
65a0: 54 45 5f 4f 53 32 5f 4e 4f 5f 57 41 4c 5f 4c 4f  TE_OS2_NO_WAL_LO
65b0: 43 4b 5f 46 49 4c 45 0a 23 64 65 66 69 6e 65 20  CK_FILE.#define 
65c0: 4f 53 32 5f 53 48 4d 5f 42 41 53 45 20 20 20 28  OS2_SHM_BASE   (
65d0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 2b 20 30  PENDING_BYTE + 0
65e0: 78 31 30 30 30 30 29 20 20 20 20 20 20 20 20 20  x10000)         
65f0: 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79  /* first lock by
6600: 74 65 20 2a 2f 0a 23 65 6c 73 65 0a 23 64 65 66  te */.#else.#def
6610: 69 6e 65 20 4f 53 32 5f 53 48 4d 5f 42 41 53 45  ine OS2_SHM_BASE
6620: 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53     ((22+SQLITE_S
6630: 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20  HM_NLOCK)*4)    
6640: 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63      /* first loc
6650: 6b 20 62 79 74 65 20 2a 2f 0a 23 65 6e 64 69 66  k byte */.#endif
6660: 0a 0a 23 64 65 66 69 6e 65 20 4f 53 32 5f 53 48  ..#define OS2_SH
6670: 4d 5f 44 4d 53 20 20 20 20 28 4f 53 32 5f 53 48  M_DMS    (OS2_SH
6680: 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48  M_BASE+SQLITE_SH
6690: 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61  M_NLOCK)  /* dea
66a0: 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a  dman switch */..
66b0: 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69  /*.** Apply advi
66c0: 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
66d0: 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e  ll n bytes begin
66e0: 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f  ning at ofst..*/
66f0: 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e  .#define _SHM_UN
6700: 4c 43 4b 20 20 31 20 20 20 2f 2a 20 6e 6f 20 6c  LCK  1   /* no l
6710: 6f 63 6b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 5f  ock */.#define _
6720: 53 48 4d 5f 52 44 4c 43 4b 20 20 32 20 20 20 2f  SHM_RDLCK  2   /
6730: 2a 20 73 68 61 72 65 64 20 6c 6f 63 6b 2c 20 6e  * shared lock, n
6740: 6f 20 77 61 69 74 20 2a 2f 0a 23 64 65 66 69 6e  o wait */.#defin
6750: 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 20  e _SHM_WRLCK  3 
6760: 20 20 2f 2a 20 65 78 6c 75 73 69 76 65 20 6c 6f    /* exlusive lo
6770: 63 6b 2c 20 6e 6f 20 77 61 69 74 20 2a 2f 0a 23  ck, no wait */.#
6780: 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43  define _SHM_WRLC
6790: 4b 5f 57 41 49 54 20 34 20 2f 2a 20 65 78 63 6c  K_WAIT 4 /* excl
67a0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 77 61 69 74  usive lock, wait
67b0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f   */.static int o
67c0: 73 32 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  s2ShmSystemLock(
67d0: 0a 20 20 6f 73 32 53 68 6d 4e 6f 64 65 20 2a 70  .  os2ShmNode *p
67e0: 4e 6f 64 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c  Node,    /* Appl
67f0: 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
6800: 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
6810: 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
6820: 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20  int lockType,   
6830: 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e        /* _SHM_UN
6840: 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  LCK, _SHM_RDLCK,
6850: 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 6f 72 20 5f   _SHM_WRLCK or _
6860: 53 48 4d 5f 57 52 4c 43 4b 5f 57 41 49 54 20 2a  SHM_WRLCK_WAIT *
6870: 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
6880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
6890: 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74  set to first byt
68a0: 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75  e to be locked/u
68b0: 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  nlocked */.  int
68c0: 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20   nByte          
68d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
68e0: 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72  bytes to lock or
68f0: 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20   unlock */.){.  
6900: 41 50 49 52 45 54 20 72 63 3b 0a 20 20 46 49 4c  APIRET rc;.  FIL
6910: 45 4c 4f 43 4b 20 61 72 65 61 3b 0a 20 20 55 4c  ELOCK area;.  UL
6920: 4f 4e 47 20 6d 6f 64 65 2c 20 74 69 6d 65 6f 75  ONG mode, timeou
6930: 74 3b 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20  t;..  /* Access 
6940: 74 6f 20 74 68 65 20 6f 73 32 53 68 6d 4e 6f 64  to the os2ShmNod
6950: 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69  e object is seri
6960: 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61  alized by the ca
6970: 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  ller */.  assert
6980: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
6990: 68 65 6c 64 28 70 4e 6f 64 65 2d 3e 6d 75 74 65  held(pNode->mute
69a0: 78 29 20 7c 7c 20 70 4e 6f 64 65 2d 3e 6e 52 65  x) || pNode->nRe
69b0: 66 3d 3d 30 20 29 3b 0a 0a 20 20 6d 6f 64 65 20  f==0 );..  mode 
69c0: 3d 20 31 3b 20 20 20 20 20 2f 2a 20 73 68 61 72  = 1;     /* shar
69d0: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 74 69 6d  ed lock */.  tim
69e0: 65 6f 75 74 20 3d 20 30 3b 20 20 2f 2a 20 6e 6f  eout = 0;  /* no
69f0: 20 77 61 69 74 20 2a 2f 0a 20 20 61 72 65 61 2e   wait */.  area.
6a00: 6c 4f 66 66 73 65 74 20 3d 20 6f 66 73 74 3b 0a  lOffset = ofst;.
6a10: 20 20 61 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20    area.lRange = 
6a20: 6e 42 79 74 65 3b 0a 0a 20 20 73 77 69 74 63 68  nByte;..  switch
6a30: 28 20 6c 6f 63 6b 54 79 70 65 20 29 20 7b 0a 20  ( lockType ) {. 
6a40: 20 20 20 63 61 73 65 20 5f 53 48 4d 5f 57 52 4c     case _SHM_WRL
6a50: 43 4b 5f 57 41 49 54 3a 0a 20 20 20 20 20 20 74  CK_WAIT:.      t
6a60: 69 6d 65 6f 75 74 20 3d 20 28 55 4c 4f 4e 47 29  imeout = (ULONG)
6a70: 2d 31 3b 20 20 20 20 20 20 2f 2a 20 77 61 69 74  -1;      /* wait
6a80: 20 66 6f 72 65 76 65 72 20 2a 2f 0a 20 20 20 20   forever */.    
6a90: 63 61 73 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 3a  case _SHM_WRLCK:
6aa0: 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 30 3b  .      mode = 0;
6ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ac0: 20 2f 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   /* exclusive lo
6ad0: 63 6b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 5f  ck */.    case _
6ae0: 53 48 4d 5f 52 44 4c 43 4b 3a 0a 20 20 20 20 20  SHM_RDLCK:.     
6af0: 20 72 63 20 3d 20 44 6f 73 53 65 74 46 69 6c 65   rc = DosSetFile
6b00: 4c 6f 63 6b 73 28 70 4e 6f 64 65 2d 3e 68 4c 6f  Locks(pNode->hLo
6b10: 63 6b 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20  ckFile, .       
6b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b30: 20 20 20 20 4e 55 4c 4c 2c 20 26 61 72 65 61 2c      NULL, &area,
6b40: 20 74 69 6d 65 6f 75 74 2c 20 6d 6f 64 65 29 3b   timeout, mode);
6b50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6b60: 20 20 2f 2a 20 63 61 73 65 20 5f 53 48 4d 5f 55    /* case _SHM_U
6b70: 4e 4c 43 4b 3a 20 2a 2f 0a 20 20 20 20 64 65 66  NLCK: */.    def
6b80: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 63 20 3d  ault:.      rc =
6b90: 20 44 6f 73 53 65 74 46 69 6c 65 4c 6f 63 6b 73   DosSetFileLocks
6ba0: 28 70 4e 6f 64 65 2d 3e 68 4c 6f 63 6b 46 69 6c  (pNode->hLockFil
6bb0: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
6bd0: 61 72 65 61 2c 20 4e 55 4c 4c 2c 20 30 2c 20 30  area, NULL, 0, 0
6be0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6bf0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
6c10: 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
6c20: 4f 43 4b 20 25 64 20 25 73 20 25 73 20 30 78 25  OCK %d %s %s 0x%
6c30: 30 38 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 20 20  08lx\n", .      
6c40: 20 20 20 20 20 70 4e 6f 64 65 2d 3e 68 4c 6f 63       pNode->hLoc
6c50: 6b 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20  kFile,.         
6c60: 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
6c70: 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
6c80: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f  ",.           lo
6c90: 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c  ckType==_SHM_UNL
6ca0: 43 4b 20 3f 20 22 55 6e 6c 6f 63 6b 22 20 3a 20  CK ? "Unlock" : 
6cb0: 22 4c 6f 63 6b 22 2c 0a 20 20 20 20 20 20 20 20  "Lock",.        
6cc0: 20 20 20 72 63 29 29 3b 0a 0a 20 20 45 52 52 5f     rc));..  ERR_
6cd0: 54 52 41 43 45 28 72 63 2c 20 28 22 6f 73 32 53  TRACE(rc, ("os2S
6ce0: 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 3a 20 25 64  hmSystemLock: %d
6cf0: 20 25 73 5c 6e 22 2c 20 72 63 2c 20 70 4e 6f 64   %s\n", rc, pNod
6d00: 65 2d 3e 73 68 6d 42 61 73 65 4e 61 6d 65 29 29  e->shmBaseName))
6d10: 0a 0a 20 20 72 65 74 75 72 6e 20 28 20 72 63 20  ..  return ( rc 
6d20: 3d 3d 20 30 20 29 20 3f 20 20 53 51 4c 49 54 45  == 0 ) ?  SQLITE
6d30: 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  _OK : SQLITE_BUS
6d40: 59 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  Y;.}../*.** Find
6d50: 20 61 6e 20 6f 73 32 53 68 6d 4e 6f 64 65 20 69   an os2ShmNode i
6d60: 6e 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 6f 72  n global list or
6d70: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
6d80: 6f 6e 65 2c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  one, if not foun
6d90: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  d..**.** This is
6da0: 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65   not a VFS share
6db0: 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b  d-memory method;
6dc0: 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79   it is a utility
6dd0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
6de0: 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65  .** by VFS share
6df0: 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73  d-memory methods
6e00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6e10: 6f 73 32 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  os2OpenSharedMem
6e20: 6f 72 79 28 20 6f 73 32 46 69 6c 65 20 2a 66 64  ory( os2File *fd
6e30: 2c 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 20 29  , int szRegion )
6e40: 20 7b 0a 20 20 6f 73 32 53 68 6d 4c 69 6e 6b 20   {.  os2ShmLink 
6e50: 2a 70 4c 69 6e 6b 3b 0a 20 20 6f 73 32 53 68 6d  *pLink;.  os2Shm
6e60: 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 69  Node *pNode;.  i
6e70: 6e 74 20 63 62 53 68 6d 4e 61 6d 65 2c 20 72 63  nt cbShmName, rc
6e80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
6e90: 63 68 61 72 20 73 68 6d 4e 61 6d 65 5b 43 43 48  char shmName[CCH
6ea0: 4d 41 58 50 41 54 48 20 2b 20 33 30 5d 3b 0a 23  MAXPATH + 30];.#
6eb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 53  ifndef SQLITE_OS
6ec0: 32 5f 4e 4f 5f 57 41 4c 5f 4c 4f 43 4b 5f 46 49  2_NO_WAL_LOCK_FI
6ed0: 4c 45 0a 20 20 55 4c 4f 4e 47 20 61 63 74 69 6f  LE.  ULONG actio
6ee0: 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f  n;.#endif.  .  /
6ef0: 2a 20 57 65 20 6e 65 65 64 20 73 6f 6d 65 20 61  * We need some a
6f00: 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20  dditional space 
6f10: 61 74 20 74 68 65 20 65 6e 64 20 74 6f 20 61 70  at the end to ap
6f20: 70 65 6e 64 20 74 68 65 20 72 65 67 69 6f 6e 20  pend the region 
6f30: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 62 53 68  number */.  cbSh
6f40: 6d 4e 61 6d 65 20 3d 20 73 70 72 69 6e 74 66 28  mName = sprintf(
6f50: 73 68 6d 4e 61 6d 65 2c 20 22 5c 5c 53 48 41 52  shmName, "\\SHAR
6f60: 45 4d 45 4d 5c 5c 25 73 22 2c 20 66 64 2d 3e 7a  EMEM\\%s", fd->z
6f70: 46 75 6c 6c 50 61 74 68 43 70 20 29 3b 0a 20 20  FullPathCp );.  
6f80: 69 66 28 20 63 62 53 68 6d 4e 61 6d 65 20 3e 3d  if( cbShmName >=
6f90: 20 43 43 48 4d 41 58 50 41 54 48 2d 38 20 29 0a   CCHMAXPATH-8 ).
6fa0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6fb0: 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3b  E_IOERR_SHMOPEN;
6fc0: 20 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20   ..  /* Replace 
6fd0: 63 6f 6c 6f 6e 20 69 6e 20 66 69 6c 65 20 6e 61  colon in file na
6fe0: 6d 65 20 74 6f 20 66 6f 72 6d 20 61 20 76 61 6c  me to form a val
6ff0: 69 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  id shared memory
7000: 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 68 6d 4e 61   name */.  shmNa
7010: 6d 65 5b 31 30 2b 31 5d 20 3d 20 27 21 27 3b 0a  me[10+1] = '!';.
7020: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6c  .  /* Allocate l
7030: 69 6e 6b 20 6f 62 6a 65 63 74 20 28 77 65 20 66  ink object (we f
7040: 72 65 65 20 69 74 20 6c 61 74 65 72 20 69 6e 20  ree it later in 
7050: 63 61 73 65 20 6f 66 20 66 61 69 6c 75 72 65 29  case of failure)
7060: 20 2a 2f 0a 20 20 70 4c 69 6e 6b 20 3d 20 73 71   */.  pLink = sq
7070: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
7080: 7a 65 6f 66 28 2a 70 4c 69 6e 6b 29 20 29 3b 0a  zeof(*pLink) );.
7090: 20 20 69 66 28 20 21 70 4c 69 6e 6b 20 29 0a 20    if( !pLink ). 
70a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
70b0: 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 2f 2a 20 41 63  _NOMEM;..  /* Ac
70c0: 63 65 73 73 20 6e 6f 64 65 20 6c 69 73 74 20 2a  cess node list *
70d0: 2f 0a 20 20 6f 73 32 53 68 6d 45 6e 74 65 72 4d  /.  os2ShmEnterM
70e0: 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 46 69  utex();..  /* Fi
70f0: 6e 64 20 6e 6f 64 65 20 62 79 20 69 74 27 73 20  nd node by it's 
7100: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 61  shared memory ba
7110: 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72  se name */.  for
7120: 28 20 70 4e 6f 64 65 20 3d 20 6f 73 32 53 68 6d  ( pNode = os2Shm
7130: 4e 6f 64 65 4c 69 73 74 3b 20 0a 20 20 20 20 20  NodeList; .     
7140: 20 20 70 4e 6f 64 65 20 26 26 20 73 74 72 69 63    pNode && stric
7150: 6d 70 28 73 68 6d 4e 61 6d 65 2c 20 70 4e 6f 64  mp(shmName, pNod
7160: 65 2d 3e 73 68 6d 42 61 73 65 4e 61 6d 65 29 20  e->shmBaseName) 
7170: 21 3d 20 30 3b 20 0a 20 20 20 20 20 20 20 70 4e  != 0; .       pN
7180: 6f 64 65 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65  ode = pNode->pNe
7190: 78 74 20 29 20 20 20 3b 0a 0a 20 20 2f 2a 20 4e  xt )   ;..  /* N
71a0: 6f 74 20 66 6f 75 6e 64 3a 20 61 6c 6c 6f 63 61  ot found: alloca
71b0: 74 65 20 61 20 6e 65 77 20 6e 6f 64 65 20 2a 2f  te a new node */
71c0: 0a 20 20 69 66 28 20 21 70 4e 6f 64 65 20 29 20  .  if( !pNode ) 
71d0: 7b 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 73 71  {.    pNode = sq
71e0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
71f0: 7a 65 6f 66 28 2a 70 4e 6f 64 65 29 20 2b 20 63  zeof(*pNode) + c
7200: 62 53 68 6d 4e 61 6d 65 20 29 3b 0a 20 20 20 20  bShmName );.    
7210: 69 66 28 20 70 4e 6f 64 65 20 29 20 7b 0a 20 20  if( pNode ) {.  
7220: 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 6f 64 65      memset(pNode
7230: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 6f  , 0, sizeof(*pNo
7240: 64 65 29 20 29 3b 0a 20 20 20 20 20 20 70 4e 6f  de) );.      pNo
7250: 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73  de->szRegion = s
7260: 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 70  zRegion;.      p
7270: 4e 6f 64 65 2d 3e 68 4c 6f 63 6b 46 69 6c 65 20  Node->hLockFile 
7280: 3d 20 28 48 46 49 4c 45 29 2d 31 3b 20 20 20 20  = (HFILE)-1;    
7290: 20 20 0a 20 20 20 20 20 20 73 74 72 63 70 79 28    .      strcpy(
72a0: 70 4e 6f 64 65 2d 3e 73 68 6d 42 61 73 65 4e 61  pNode->shmBaseNa
72b0: 6d 65 2c 20 73 68 6d 4e 61 6d 65 29 3b 0a 0a 23  me, shmName);..#
72c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 53 32  ifdef SQLITE_OS2
72d0: 5f 4e 4f 5f 57 41 4c 5f 4c 4f 43 4b 5f 46 49 4c  _NO_WAL_LOCK_FIL
72e0: 45 0a 20 20 20 20 20 20 69 66 28 20 44 6f 73 44  E.      if( DosD
72f0: 75 70 48 61 6e 64 6c 65 28 66 64 2d 3e 68 2c 20  upHandle(fd->h, 
7300: 26 70 4e 6f 64 65 2d 3e 68 4c 6f 63 6b 46 69 6c  &pNode->hLockFil
7310: 65 29 20 21 3d 20 30 20 29 20 7b 0a 23 65 6c 73  e) != 0 ) {.#els
7320: 65 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  e.      sprintf(
7330: 73 68 6d 4e 61 6d 65 2c 20 22 25 73 2d 6c 63 6b  shmName, "%s-lck
7340: 22 2c 20 66 64 2d 3e 7a 46 75 6c 6c 50 61 74 68  ", fd->zFullPath
7350: 43 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 44  Cp);.      if( D
7360: 6f 73 4f 70 65 6e 28 28 50 53 5a 29 73 68 6d 4e  osOpen((PSZ)shmN
7370: 61 6d 65 2c 20 26 70 4e 6f 64 65 2d 3e 68 4c 6f  ame, &pNode->hLo
7380: 63 6b 46 69 6c 65 2c 20 26 61 63 74 69 6f 6e 2c  ckFile, &action,
7390: 20 30 2c 20 46 49 4c 45 5f 4e 4f 52 4d 41 4c 2c   0, FILE_NORMAL,
73a0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
73b0: 20 20 20 20 4f 50 45 4e 5f 41 43 54 49 4f 4e 5f      OPEN_ACTION_
73c0: 4f 50 45 4e 5f 49 46 5f 45 58 49 53 54 53 20 7c  OPEN_IF_EXISTS |
73d0: 20 4f 50 45 4e 5f 41 43 54 49 4f 4e 5f 43 52 45   OPEN_ACTION_CRE
73e0: 41 54 45 5f 49 46 5f 4e 45 57 2c 0a 20 20 20 20  ATE_IF_NEW,.    
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
7400: 45 4e 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  EN_ACCESS_READWR
7410: 49 54 45 20 7c 20 4f 50 45 4e 5f 53 48 41 52 45  ITE | OPEN_SHARE
7420: 5f 44 45 4e 59 4e 4f 4e 45 20 7c 20 0a 20 20 20  _DENYNONE | .   
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f                 O
7440: 50 45 4e 5f 46 4c 41 47 53 5f 4e 4f 49 4e 48 45  PEN_FLAGS_NOINHE
7450: 52 49 54 20 7c 20 4f 50 45 4e 5f 46 4c 41 47 53  RIT | OPEN_FLAGS
7460: 5f 46 41 49 4c 5f 4f 4e 5f 45 52 52 4f 52 2c 0a  _FAIL_ON_ERROR,.
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 20 4e 55 4c 4c 29 20 21 3d 20 30 20 29 20 7b    NULL) != 0 ) {
7490: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
74a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 6f  sqlite3_free(pNo
74b0: 64 65 29 3b 20 20 0a 20 20 20 20 20 20 20 20 72  de);  .        r
74c0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
74d0: 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
74e0: 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  .        pNode->
74f0: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
7500: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
7510: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
7520: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4e 6f          if( !pNo
7530: 64 65 2d 3e 6d 75 74 65 78 20 29 20 7b 0a 20 20  de->mutex ) {.  
7540: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7550: 66 72 65 65 28 70 4e 6f 64 65 29 3b 20 20 0a 20  free(pNode);  . 
7560: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
7570: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
7580: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 20      }.      }   
7590: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
75a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
75b0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
75c0: 20 0a 20 20 20 20 69 66 28 20 72 63 20 3d 3d 20   .    if( rc == 
75d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20  SQLITE_OK ) {.  
75e0: 20 20 20 20 70 4e 6f 64 65 2d 3e 70 4e 65 78 74      pNode->pNext
75f0: 20 3d 20 6f 73 32 53 68 6d 4e 6f 64 65 4c 69 73   = os2ShmNodeLis
7600: 74 3b 0a 20 20 20 20 20 20 6f 73 32 53 68 6d 4e  t;.      os2ShmN
7610: 6f 64 65 4c 69 73 74 20 3d 20 70 4e 6f 64 65 3b  odeList = pNode;
7620: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
7630: 20 20 20 20 70 4e 6f 64 65 20 3d 20 4e 55 4c 4c      pNode = NULL
7640: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65  ;.    }.  } else
7650: 20 69 66 28 20 70 4e 6f 64 65 2d 3e 73 7a 52 65   if( pNode->szRe
7660: 67 69 6f 6e 20 21 3d 20 73 7a 52 65 67 69 6f 6e  gion != szRegion
7670: 20 29 20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51   ) {.    rc = SQ
7680: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
7690: 5a 45 3b 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20  ZE;.    pNode = 
76a0: 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  NULL;.  }..  if(
76b0: 20 70 4e 6f 64 65 20 29 20 7b 0a 20 20 20 20 73   pNode ) {.    s
76c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
76d0: 65 72 28 70 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  er(pNode->mutex)
76e0: 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4c  ;..    memset(pL
76f0: 69 6e 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ink, 0, sizeof(*
7700: 70 4c 69 6e 6b 29 29 3b 0a 0a 20 20 20 20 70 4c  pLink));..    pL
7710: 69 6e 6b 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20  ink->pShmNode = 
7720: 70 4e 6f 64 65 3b 0a 20 20 20 20 70 4c 69 6e 6b  pNode;.    pLink
7730: 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 6f 64 65 2d  ->pNext = pNode-
7740: 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 70 4e 6f  >pFirst;.    pNo
7750: 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 4c 69  de->pFirst = pLi
7760: 6e 6b 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 6e  nk;.    pNode->n
7770: 52 65 66 2b 2b 3b 0a 0a 20 20 20 20 66 64 2d 3e  Ref++;..    fd->
7780: 70 53 68 6d 4c 69 6e 6b 20 3d 20 70 4c 69 6e 6b  pShmLink = pLink
7790: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  ;..    sqlite3_m
77a0: 75 74 65 78 5f 6c 65 61 76 65 28 70 4e 6f 64 65  utex_leave(pNode
77b0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 0a 20  ->mutex);.    . 
77c0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a   } else {.    /*
77d0: 20 45 72 72 6f 72 20 6f 63 63 75 72 65 64 2e 20   Error occured. 
77e0: 46 72 65 65 20 6f 75 72 20 6c 69 6e 6b 20 6f 62  Free our link ob
77f0: 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ject. */.    sql
7800: 69 74 65 33 5f 66 72 65 65 28 70 4c 69 6e 6b 29  ite3_free(pLink)
7810: 3b 20 20 0a 20 20 7d 0a 0a 20 20 6f 73 32 53 68  ;  .  }..  os2Sh
7820: 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  mLeaveMutex();..
7830: 20 20 45 52 52 5f 54 52 41 43 45 28 72 63 2c 20    ERR_TRACE(rc, 
7840: 28 22 6f 73 32 4f 70 65 6e 53 68 61 72 65 64 4d  ("os2OpenSharedM
7850: 65 6d 6f 72 79 3a 20 25 64 20 20 25 73 5c 6e 22  emory: %d  %s\n"
7860: 2c 20 72 63 2c 20 66 64 2d 3e 7a 46 75 6c 6c 50  , rc, fd->zFullP
7870: 61 74 68 43 70 29 29 20 20 0a 20 20 0a 20 20 72  athCp))  .  .  r
7880: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7890: 2a 2a 20 50 75 72 67 65 20 74 68 65 20 6f 73 32  ** Purge the os2
78a0: 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74  ShmNodeList list
78b0: 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
78c0: 77 69 74 68 20 6e 52 65 66 3d 3d 30 2e 0a 2a 2a  with nRef==0..**
78d0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
78e0: 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  a VFS shared-mem
78f0: 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69  ory method; it i
7900: 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63  s a utility func
7910: 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62  tion called.** b
7920: 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  y VFS shared-mem
7930: 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  ory methods..*/.
7940: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 73 32 50  static void os2P
7950: 75 72 67 65 53 68 6d 4e 6f 64 65 73 28 20 69 6e  urgeShmNodes( in
7960: 74 20 64 65 6c 65 74 65 46 6c 61 67 20 29 20 7b  t deleteFlag ) {
7970: 0a 20 20 6f 73 32 53 68 6d 4e 6f 64 65 20 2a 70  .  os2ShmNode *p
7980: 4e 6f 64 65 3b 0a 20 20 6f 73 32 53 68 6d 4e 6f  Node;.  os2ShmNo
7990: 64 65 20 2a 2a 70 70 4e 6f 64 65 3b 0a 0a 20 20  de **ppNode;..  
79a0: 6f 73 32 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  os2ShmEnterMutex
79b0: 28 29 3b 0a 20 20 0a 20 20 70 70 4e 6f 64 65 20  ();.  .  ppNode 
79c0: 3d 20 26 6f 73 32 53 68 6d 4e 6f 64 65 4c 69 73  = &os2ShmNodeLis
79d0: 74 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  t;..  while( *pp
79e0: 4e 6f 64 65 20 29 20 7b 0a 20 20 20 20 70 4e 6f  Node ) {.    pNo
79f0: 64 65 20 3d 20 2a 70 70 4e 6f 64 65 3b 0a 0a 20  de = *ppNode;.. 
7a00: 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 6e 52     if( pNode->nR
7a10: 65 66 20 3d 3d 20 30 20 29 20 7b 0a 20 20 20 20  ef == 0 ) {.    
7a20: 20 20 2a 70 70 4e 6f 64 65 20 3d 20 70 4e 6f 64    *ppNode = pNod
7a30: 65 2d 3e 70 4e 65 78 74 3b 20 20 20 0a 20 20 20  e->pNext;   .   
7a40: 20 20 0a 20 20 20 20 20 20 69 66 28 20 70 4e 6f    .      if( pNo
7a50: 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 29 20 7b  de->apRegion ) {
7a60: 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76  .        /* Prev
7a70: 65 6e 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ent other proces
7a80: 73 65 73 20 66 72 6f 6d 20 72 65 73 69 7a 69 6e  ses from resizin
7a90: 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
7aa0: 6f 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f  ory */.        o
7ab0: 73 32 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  s2ShmSystemLock(
7ac0: 70 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43  pNode, _SHM_WRLC
7ad0: 4b 5f 57 41 49 54 2c 20 4f 53 32 5f 53 48 4d 5f  K_WAIT, OS2_SHM_
7ae0: 44 4d 53 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20  DMS, 1);..      
7af0: 20 20 77 68 69 6c 65 28 20 70 4e 6f 64 65 2d 3e    while( pNode->
7b00: 6e 52 65 67 69 6f 6e 2d 2d 20 29 20 7b 0a 23 69  nRegion-- ) {.#i
7b10: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
7b20: 47 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  G.          int 
7b30: 72 63 20 3d 20 0a 23 65 6e 64 69 66 20 20 20 20  rc = .#endif    
7b40: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
7b50: 20 44 6f 73 46 72 65 65 4d 65 6d 28 70 4e 6f 64   DosFreeMem(pNod
7b60: 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 4e 6f 64  e->apRegion[pNod
7b70: 65 2d 3e 6e 52 65 67 69 6f 6e 5d 29 3b 0a 0a 20  e->nRegion]);.. 
7b80: 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45           OSTRACE
7b90: 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64  (("SHM-PURGE pid
7ba0: 2d 25 64 20 75 6e 6d 61 70 20 72 65 67 69 6f 6e  -%d unmap region
7bb0: 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  =%d %s\n",.     
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
7bd0: 74 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  t)GetCurrentProc
7be0: 65 73 73 49 64 28 29 2c 20 70 4e 6f 64 65 2d 3e  essId(), pNode->
7bf0: 6e 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20  nRegion,.       
7c00: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 3d             rc ==
7c10: 20 30 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69   0 ? "ok" : "fai
7c20: 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20  led"));.        
7c30: 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  }..        /* Al
7c40: 6c 6f 77 20 6f 74 68 65 72 20 70 72 6f 63 65 73  low other proces
7c50: 73 65 73 20 74 6f 20 72 65 73 69 7a 65 20 74 68  ses to resize th
7c60: 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
7c70: 2a 2f 0a 20 20 20 20 20 20 20 20 6f 73 32 53 68  */.        os2Sh
7c80: 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 4e 6f 64  mSystemLock(pNod
7c90: 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 4f  e, _SHM_UNLCK, O
7ca0: 53 32 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  S2_SHM_DMS, 1);.
7cb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7cc0: 5f 66 72 65 65 28 70 4e 6f 64 65 2d 3e 61 70 52  _free(pNode->apR
7cd0: 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 20  egion);.      } 
7ce0: 20 0a 0a 20 20 20 20 20 20 44 6f 73 43 6c 6f 73   ..      DosClos
7cf0: 65 28 70 4e 6f 64 65 2d 3e 68 4c 6f 63 6b 46 69  e(pNode->hLockFi
7d00: 6c 65 29 3b 0a 20 20 20 20 20 20 0a 23 69 66 6e  le);.      .#ifn
7d10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 53 32 5f 4e  def SQLITE_OS2_N
7d20: 4f 5f 57 41 4c 5f 4c 4f 43 4b 5f 46 49 4c 45 0a  O_WAL_LOCK_FILE.
7d30: 20 20 20 20 20 20 69 66 28 20 64 65 6c 65 74 65        if( delete
7d40: 46 6c 61 67 20 29 20 7b 0a 20 20 20 20 20 20 20  Flag ) {.       
7d50: 20 20 63 68 61 72 20 66 69 6c 65 4e 61 6d 65 5b    char fileName[
7d60: 43 43 48 4d 41 58 50 41 54 48 5d 3b 0a 20 20 20  CCHMAXPATH];.   
7d70: 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 22 5c        /* Skip "\
7d80: 5c 53 48 41 52 45 4d 45 4d 5c 5c 22 20 2a 2f 0a  \SHAREMEM\\" */.
7d90: 20 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66           sprintf
7da0: 28 66 69 6c 65 4e 61 6d 65 2c 20 22 25 73 2d 6c  (fileName, "%s-l
7db0: 63 6b 22 2c 20 70 4e 6f 64 65 2d 3e 73 68 6d 42  ck", pNode->shmB
7dc0: 61 73 65 4e 61 6d 65 20 2b 20 31 30 29 3b 0a 20  aseName + 10);. 
7dd0: 20 20 20 20 20 20 20 20 2f 2a 20 72 65 73 74 6f          /* resto
7de0: 72 65 20 63 6f 6c 6f 6e 20 2a 2f 0a 20 20 20 20  re colon */.    
7df0: 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 5b 31 5d       fileName[1]
7e00: 20 3d 20 27 3a 27 3b 0a 20 20 20 20 20 20 20 20   = ':';.        
7e10: 20 0a 20 20 20 20 20 20 20 20 20 44 6f 73 46 6f   .         DosFo
7e20: 72 63 65 44 65 6c 65 74 65 28 66 69 6c 65 4e 61  rceDelete(fileNa
7e30: 6d 65 29 3b 20 0a 20 20 20 20 20 20 7d 0a 23 65  me); .      }.#e
7e40: 6e 64 69 66 0a 0a 20 20 20 20 20 20 73 71 6c 69  ndif..      sqli
7e50: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
7e60: 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  Node->mutex);.. 
7e70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7e80: 65 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20  e(pNode);.      
7e90: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
7ea0: 20 20 20 20 70 70 4e 6f 64 65 20 3d 20 26 70 4e      ppNode = &pN
7eb0: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
7ec0: 7d 0a 20 20 7d 20 0a 0a 20 20 6f 73 32 53 68 6d  }.  } ..  os2Shm
7ed0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
7ee0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
7ef0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
7f00: 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74  o obtain a point
7f10: 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65  er to region iRe
7f20: 67 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73  gion of the.** s
7f30: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73  hared-memory ass
7f40: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
7f50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
7f60: 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79  d. Shared-memory
7f70: 20 72 65 67 69 6f 6e 73 0a 2a 2a 20 61 72 65 20   regions.** are 
7f80: 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e  numbered startin
7f90: 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63  g from zero. Eac
7fa0: 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  h shared-memory 
7fb0: 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69  region is szRegi
7fc0: 6f 6e 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  on.** bytes in s
7fd0: 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
7fe0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
7ff0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
8000: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
8010: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
8020: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
8030: 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64  , if the bExtend
8040: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
8050: 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
8060: 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a  d shared-memory.
8070: 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ** region has no
8080: 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
8090: 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c   (by any client,
80a0: 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72   including one r
80b0: 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73  unning in a.** s
80c0: 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29  eparate process)
80d0: 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65  , then *pp is se
80e0: 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
80f0: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
8100: 2e 20 49 66 0a 2a 2a 20 62 45 78 74 65 6e 64 20  . If.** bExtend 
8110: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
8120: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
8130: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
8140: 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 0a 2a  on has not yet.*
8150: 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  * been allocated
8160: 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  , it is allocate
8170: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
8180: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  on..**.** If the
8190: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
81a0: 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  egion has alread
81b0: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
81c0: 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   or is allocated
81d0: 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c   by.** this call
81e0: 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62   as described ab
81f0: 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ove, then it is 
8200: 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
8210: 20 70 72 6f 63 65 73 73 65 73 0a 2a 2a 20 61 64   processes.** ad
8220: 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20  dress space (if 
8230: 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
8240: 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  y), *pp is set t
8250: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
8260: 61 70 70 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20  apped.** memory 
8270: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
8280: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
8290: 63 20 69 6e 74 20 6f 73 32 53 68 6d 4d 61 70 28  c int os2ShmMap(
82a0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
82b0: 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *id,            
82c0: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65     /* Handle ope
82d0: 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  n on database fi
82e0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
82f0: 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
8300: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f          /* Regio
8310: 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f  n to retrieve */
8320: 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c  .  int szRegion,
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8340: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
8350: 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62  gions */.  int b
8360: 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20 20 20  Extend,         
8370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
8380: 75 65 20 74 6f 20 65 78 74 65 6e 64 20 62 6c 6f  ue to extend blo
8390: 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  ck if necessary 
83a0: 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
83b0: 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20  le **pp         
83c0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70       /* OUT: Map
83d0: 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  ped memory */.){
83e0: 0a 20 20 50 56 4f 49 44 20 70 76 54 65 6d 70 3b  .  PVOID pvTemp;
83f0: 0a 20 20 76 6f 69 64 20 2a 2a 61 70 52 65 67 69  .  void **apRegi
8400: 6f 6e 3b 0a 20 20 6f 73 32 53 68 6d 4e 6f 64 65  on;.  os2ShmNode
8410: 20 2a 70 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 6e   *pNode;.  int n
8420: 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  , rc = SQLITE_OK
8430: 3b 0a 20 20 63 68 61 72 20 73 68 6d 4e 61 6d 65  ;.  char shmName
8440: 5b 43 43 48 4d 41 58 50 41 54 48 5d 3b 0a 20 20  [CCHMAXPATH];.  
8450: 6f 73 32 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  os2File *pFile =
8460: 20 28 6f 73 32 46 69 6c 65 2a 29 69 64 3b 0a 20   (os2File*)id;. 
8470: 20 0a 20 20 2a 70 70 20 3d 20 4e 55 4c 4c 3b 0a   .  *pp = NULL;.
8480: 0a 20 20 69 66 28 20 21 70 46 69 6c 65 2d 3e 70  .  if( !pFile->p
8490: 53 68 6d 4c 69 6e 6b 20 29 0a 20 20 20 20 72 63  ShmLink ).    rc
84a0: 20 3d 20 6f 73 32 4f 70 65 6e 53 68 61 72 65 64   = os2OpenShared
84b0: 4d 65 6d 6f 72 79 28 20 70 46 69 6c 65 2c 20 73  Memory( pFile, s
84c0: 7a 52 65 67 69 6f 6e 20 29 3b 0a 20 20 0a 20 20  zRegion );.  .  
84d0: 69 66 28 20 72 63 20 3d 3d 20 53 51 4c 49 54 45  if( rc == SQLITE
84e0: 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 70 4e 6f 64  _OK ) {.    pNod
84f0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 53 68 6d 4c  e = pFile->pShmL
8500: 69 6e 6b 2d 3e 70 53 68 6d 4e 6f 64 65 20 3b 0a  ink->pShmNode ;.
8510: 20 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33      .    sqlite3
8520: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4e 6f  _mutex_enter(pNo
8530: 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  de->mutex);.    
8540: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 52  .    assert( szR
8550: 65 67 69 6f 6e 3d 3d 70 4e 6f 64 65 2d 3e 73 7a  egion==pNode->sz
8560: 52 65 67 69 6f 6e 20 29 3b 0a 0a 20 20 20 20 2f  Region );..    /
8570: 2a 20 55 6e 6d 61 70 70 65 64 20 72 65 67 69 6f  * Unmapped regio
8580: 6e 20 3f 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  n ? */.    if( i
8590: 52 65 67 69 6f 6e 20 3e 3d 20 70 4e 6f 64 65 2d  Region >= pNode-
85a0: 3e 6e 52 65 67 69 6f 6e 20 29 20 7b 0a 20 20 20  >nRegion ) {.   
85b0: 20 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 6f 74     /* Prevent ot
85c0: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
85d0: 6f 6d 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20  om resizing the 
85e0: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
85f0: 0a 20 20 20 20 20 20 6f 73 32 53 68 6d 53 79 73  .      os2ShmSys
8600: 74 65 6d 4c 6f 63 6b 28 70 4e 6f 64 65 2c 20 5f  temLock(pNode, _
8610: 53 48 4d 5f 57 52 4c 43 4b 5f 57 41 49 54 2c 20  SHM_WRLCK_WAIT, 
8620: 4f 53 32 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b  OS2_SHM_DMS, 1);
8630: 0a 0a 20 20 20 20 20 20 61 70 52 65 67 69 6f 6e  ..      apRegion
8640: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
8650: 6f 63 28 0a 20 20 20 20 20 20 20 20 70 4e 6f 64  oc(.        pNod
8660: 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 28 69 52  e->apRegion, (iR
8670: 65 67 69 6f 6e 20 2b 20 31 29 20 2a 20 73 69 7a  egion + 1) * siz
8680: 65 6f 66 28 61 70 52 65 67 69 6f 6e 5b 30 5d 29  eof(apRegion[0])
8690: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 61 70  );..      if( ap
86a0: 52 65 67 69 6f 6e 20 29 20 7b 0a 20 20 20 20 20  Region ) {.     
86b0: 20 20 20 70 4e 6f 64 65 2d 3e 61 70 52 65 67 69     pNode->apRegi
86c0: 6f 6e 20 3d 20 61 70 52 65 67 69 6f 6e 3b 0a 0a  on = apRegion;..
86d0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
86e0: 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 20 3c 3d  Node->nRegion <=
86f0: 20 69 52 65 67 69 6f 6e 20 29 20 7b 0a 20 20 20   iRegion ) {.   
8700: 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 73         sprintf(s
8710: 68 6d 4e 61 6d 65 2c 20 22 25 73 2d 25 75 22 2c  hmName, "%s-%u",
8720: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
8730: 20 20 20 20 70 4e 6f 64 65 2d 3e 73 68 6d 42 61      pNode->shmBa
8740: 73 65 4e 61 6d 65 2c 20 70 4e 6f 64 65 2d 3e 6e  seName, pNode->n
8750: 52 65 67 69 6f 6e 29 3b 0a 0a 20 20 20 20 20 20  Region);..      
8760: 20 20 20 20 69 66 28 20 44 6f 73 47 65 74 4e 61      if( DosGetNa
8770: 6d 65 64 53 68 61 72 65 64 4d 65 6d 28 26 70 76  medSharedMem(&pv
8780: 54 65 6d 70 2c 20 28 50 53 5a 29 73 68 6d 4e 61  Temp, (PSZ)shmNa
8790: 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  me, .           
87a0: 20 20 20 20 20 50 41 47 5f 52 45 41 44 20 7c 20       PAG_READ | 
87b0: 50 41 47 5f 57 52 49 54 45 29 20 21 3d 20 4e 4f  PAG_WRITE) != NO
87c0: 5f 45 52 52 4f 52 20 29 20 7b 0a 20 20 20 20 20  _ERROR ) {.     
87d0: 20 20 20 20 20 20 20 69 66 28 20 21 62 45 78 74         if( !bExt
87e0: 65 6e 64 20 29 0a 20 20 20 20 20 20 20 20 20 20  end ).          
87f0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
8800: 20 20 20 20 20 20 20 20 69 66 28 20 44 6f 73 41          if( DosA
8810: 6c 6c 6f 63 53 68 61 72 65 64 4d 65 6d 28 26 70  llocSharedMem(&p
8820: 76 54 65 6d 70 2c 20 28 50 53 5a 29 73 68 6d 4e  vTemp, (PSZ)shmN
8830: 61 6d 65 2c 20 73 7a 52 65 67 69 6f 6e 2c 0a 20  ame, szRegion,. 
8840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8850: 20 50 41 47 5f 52 45 41 44 20 7c 20 50 41 47 5f   PAG_READ | PAG_
8860: 57 52 49 54 45 20 7c 20 50 41 47 5f 43 4f 4d 4d  WRITE | PAG_COMM
8870: 49 54 20 7c 20 4f 42 4a 5f 41 4e 59 29 20 21 3d  IT | OBJ_ANY) !=
8880: 20 4e 4f 5f 45 52 52 4f 52 20 26 26 20 0a 20 20   NO_ERROR && .  
8890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44 6f                Do
88a0: 73 41 6c 6c 6f 63 53 68 61 72 65 64 4d 65 6d 28  sAllocSharedMem(
88b0: 26 70 76 54 65 6d 70 2c 20 28 50 53 5a 29 73 68  &pvTemp, (PSZ)sh
88c0: 6d 4e 61 6d 65 2c 20 73 7a 52 65 67 69 6f 6e 2c  mName, szRegion,
88d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
88e0: 20 20 20 50 41 47 5f 52 45 41 44 20 7c 20 50 41     PAG_READ | PA
88f0: 47 5f 57 52 49 54 45 20 7c 20 50 41 47 5f 43 4f  G_WRITE | PAG_CO
8900: 4d 4d 49 54 29 20 21 3d 20 4e 4f 5f 45 52 52 4f  MMIT) != NO_ERRO
8910: 52 20 29 20 7b 20 0a 20 20 20 20 20 20 20 20 20  R ) { .         
8920: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
8930: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
8940: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8950: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8960: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
8970: 20 20 61 70 52 65 67 69 6f 6e 5b 70 4e 6f 64 65    apRegion[pNode
8980: 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 5d 20 3d 20 70  ->nRegion++] = p
8990: 76 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7d  vTemp;.        }
89a0: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72  ..        /* zer
89b0: 6f 20 6f 75 74 20 72 65 6d 61 69 6e 69 6e 67 20  o out remaining 
89c0: 65 6e 74 72 69 65 73 20 2a 2f 20 0a 20 20 20 20  entries */ .    
89d0: 20 20 20 20 66 6f 72 28 20 6e 20 3d 20 70 4e 6f      for( n = pNo
89e0: 64 65 2d 3e 6e 52 65 67 69 6f 6e 3b 20 6e 20 3c  de->nRegion; n <
89f0: 3d 20 69 52 65 67 69 6f 6e 3b 20 6e 2b 2b 20 29  = iRegion; n++ )
8a00: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 6f 64 65  .          pNode
8a10: 2d 3e 61 70 52 65 67 69 6f 6e 5b 6e 5d 20 3d 20  ->apRegion[n] = 
8a20: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 20 20 20 20 2f  NULL;..        /
8a30: 2a 20 52 65 74 75 72 6e 20 74 68 69 73 20 72 65  * Return this re
8a40: 67 69 6f 6e 20 28 6d 61 79 62 65 20 7a 65 72 6f  gion (maybe zero
8a50: 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 70  ) */.        *pp
8a60: 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 52 65 67 69   = pNode->apRegi
8a70: 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 20  on[iRegion];.   
8a80: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
8a90: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8aa0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 0a  NOMEM;.      }..
8ab0: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 20 6f        /* Allow o
8ac0: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 74  ther processes t
8ad0: 6f 20 72 65 73 69 7a 65 20 74 68 65 20 73 68 61  o resize the sha
8ae0: 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
8af0: 20 20 20 20 6f 73 32 53 68 6d 53 79 73 74 65 6d      os2ShmSystem
8b00: 4c 6f 63 6b 28 70 4e 6f 64 65 2c 20 5f 53 48 4d  Lock(pNode, _SHM
8b10: 5f 55 4e 4c 43 4b 2c 20 4f 53 32 5f 53 48 4d 5f  _UNLCK, OS2_SHM_
8b20: 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 0a  DMS, 1);.      .
8b30: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
8b40: 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 68 61 73     /* Region has
8b50: 20 62 65 65 6e 20 6d 61 70 70 65 64 20 70 72 65   been mapped pre
8b60: 76 69 6f 75 73 6c 79 20 2a 2f 0a 20 20 20 20 20  viously */.     
8b70: 20 2a 70 70 20 3d 20 70 4e 6f 64 65 2d 3e 61 70   *pp = pNode->ap
8b80: 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b  Region[iRegion];
8b90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
8ba0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
8bb0: 70 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  pNode->mutex);. 
8bc0: 20 7d 20 0a 0a 20 20 45 52 52 5f 54 52 41 43 45   } ..  ERR_TRACE
8bd0: 28 72 63 2c 20 28 22 6f 73 32 53 68 6d 4d 61 70  (rc, ("os2ShmMap
8be0: 3a 20 25 73 20 69 52 67 6e 20 3d 20 25 64 2c 20  : %s iRgn = %d, 
8bf0: 73 7a 52 67 6e 20 3d 20 25 64 2c 20 62 45 78 74  szRgn = %d, bExt
8c00: 20 3d 20 25 64 20 3a 20 25 64 5c 6e 22 2c 20 0a   = %d : %d\n", .
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c20: 20 70 46 69 6c 65 2d 3e 7a 46 75 6c 6c 50 61 74   pFile->zFullPat
8c30: 68 43 70 2c 20 69 52 65 67 69 6f 6e 2c 20 73 7a  hCp, iRegion, sz
8c40: 52 65 67 69 6f 6e 2c 20 62 45 78 74 65 6e 64 2c  Region, bExtend,
8c50: 20 72 63 29 29 0a 20 20 20 20 20 20 20 20 20 20   rc)).          
8c60: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8c70: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
8c80: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
8c90: 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c  red-memory.  Del
8ca0: 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ete the underlyi
8cb0: 6e 67 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66  ng.** storage if
8cc0: 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74   deleteFlag is t
8cd0: 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rue..**.** If th
8ce0: 65 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64  ere is no shared
8cf0: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
8d00: 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e  ed with the conn
8d10: 65 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73  ection then this
8d20: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61  .** routine is a
8d30: 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
8d40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
8d50: 73 32 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71  s2ShmUnmap(.  sq
8d60: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
8d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8d80: 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
8d90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
8da0: 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  .  int deleteFla
8db0: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
8dc0: 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61     /* Delete sha
8dd0: 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72  red-memory if tr
8de0: 75 65 20 2a 2f 0a 29 7b 0a 20 20 6f 73 32 46 69  ue */.){.  os2Fi
8df0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 6f 73 32  le *pFile = (os2
8e00: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 6f 73 32 53  File*)id;.  os2S
8e10: 68 6d 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 20 3d 20  hmLink *pLink = 
8e20: 70 46 69 6c 65 2d 3e 70 53 68 6d 4c 69 6e 6b 3b  pFile->pShmLink;
8e30: 0a 20 20 0a 20 20 69 66 28 20 70 4c 69 6e 6b 20  .  .  if( pLink 
8e40: 29 20 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65 66  ) {.    int nRef
8e50: 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 32 53 68   = -1;.    os2Sh
8e60: 6d 4c 69 6e 6b 20 2a 2a 70 70 4c 69 6e 6b 3b 0a  mLink **ppLink;.
8e70: 20 20 20 20 6f 73 32 53 68 6d 4e 6f 64 65 20 2a      os2ShmNode *
8e80: 70 4e 6f 64 65 20 3d 20 70 4c 69 6e 6b 2d 3e 70  pNode = pLink->p
8e90: 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 73 71  ShmNode;..    sq
8ea0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
8eb0: 72 28 70 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  r(pNode->mutex);
8ec0: 0a 20 20 20 20 0a 20 20 20 20 66 6f 72 28 20 70  .    .    for( p
8ed0: 70 4c 69 6e 6b 20 3d 20 26 70 4e 6f 64 65 2d 3e  pLink = &pNode->
8ee0: 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20 20 20  pFirst;.        
8ef0: 20 2a 70 70 4c 69 6e 6b 20 26 26 20 2a 70 70 4c   *ppLink && *ppL
8f00: 69 6e 6b 20 21 3d 20 70 4c 69 6e 6b 3b 0a 20 20  ink != pLink;.  
8f10: 20 20 20 20 20 20 20 70 70 4c 69 6e 6b 20 3d 20         ppLink = 
8f20: 26 28 2a 70 70 4c 69 6e 6b 29 2d 3e 70 4e 65 78  &(*ppLink)->pNex
8f30: 74 20 29 20 20 20 3b 0a 20 20 20 20 20 20 20 20  t )   ;.        
8f40: 20 0a 20 20 20 20 61 73 73 65 72 74 28 2a 70 70   .    assert(*pp
8f50: 4c 69 6e 6b 29 3b 0a 0a 20 20 20 20 69 66 28 20  Link);..    if( 
8f60: 2a 70 70 4c 69 6e 6b 20 29 20 7b 0a 20 20 20 20  *ppLink ) {.    
8f70: 20 20 2a 70 70 4c 69 6e 6b 20 3d 20 70 4c 69 6e    *ppLink = pLin
8f80: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  k->pNext;.      
8f90: 6e 52 65 66 20 3d 20 2d 2d 70 4e 6f 64 65 2d 3e  nRef = --pNode->
8fa0: 6e 52 65 66 3b 0a 20 20 20 20 7d 20 65 6c 73 65  nRef;.    } else
8fb0: 20 7b 0a 20 20 20 20 20 20 45 52 52 5f 54 52 41   {.      ERR_TRA
8fc0: 43 45 28 31 2c 20 28 22 6f 73 32 53 68 6d 55 6e  CE(1, ("os2ShmUn
8fd0: 6d 61 70 3a 20 6c 69 6e 6b 20 6e 6f 74 20 66 6f  map: link not fo
8fe0: 75 6e 64 20 21 20 25 73 5c 6e 22 2c 20 0a 20 20  und ! %s\n", .  
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 20 20 70 4e 6f 64 65 2d 3e 73 68 6d 42 61 73 65    pNode->shmBase
9010: 4e 61 6d 65 29 29 0a 20 20 20 20 7d 0a 20 20 20  Name)).    }.   
9020: 20 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 53 68   .    pFile->pSh
9030: 6d 4c 69 6e 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20  mLink = NULL;.  
9040: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
9050: 4c 69 6e 6b 29 3b 0a 0a 20 20 20 20 73 71 6c 69  Link);..    sqli
9060: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
9070: 70 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  pNode->mutex);. 
9080: 20 20 20 0a 20 20 20 20 69 66 28 20 6e 52 65 66     .    if( nRef
9090: 20 3d 3d 20 30 20 29 0a 20 20 20 20 20 20 6f 73   == 0 ).      os
90a0: 32 50 75 72 67 65 53 68 6d 4e 6f 64 65 73 28 20  2PurgeShmNodes( 
90b0: 64 65 6c 65 74 65 46 6c 61 67 20 29 3b 0a 20 20  deleteFlag );.  
90c0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
90d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
90e0: 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20  Change the lock 
90f0: 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72  state for a shar
9100: 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
9110: 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  t..**.** Note th
9120: 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73  at the relations
9130: 68 69 70 20 62 65 74 77 65 65 6e 20 53 48 41 52  hip between SHAR
9140: 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45  Ed and EXCLUSIVE
9150: 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74   locks is a litt
9160: 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  le.** different 
9170: 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73  here than in pos
9180: 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b  ix.  In xShmLock
9190: 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66  (), one can go f
91a0: 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20  rom unlocked.** 
91b0: 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62 61  to shared and ba
91c0: 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63  ck or from unloc
91d0: 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ked to exclusive
91e0: 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20   and back.  But 
91f0: 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67  one may.** not g
9200: 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f  o from shared to
9210: 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72   exclusive or fr
9220: 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20  om exclusive to 
9230: 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  shared..*/.stati
9240: 63 20 69 6e 74 20 6f 73 32 53 68 6d 4c 6f 63 6b  c int os2ShmLock
9250: 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
9260: 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *id,          /
9270: 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
9280: 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
9290: 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
92a0: 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
92b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
92c0: 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69  st lock to acqui
92d0: 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  re or release */
92e0: 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9300: 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   Number of locks
9310: 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
9320: 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
9330: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
9340: 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74         /* What t
9350: 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f  o do with the lo
9360: 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 6d  ck */.){.  u32 m
9370: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9390: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
93a0: 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
93b0: 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ease */.  int rc
93c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
93d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93e0: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
93f0: 2f 0a 20 20 6f 73 32 46 69 6c 65 20 2a 70 46 69  /.  os2File *pFi
9400: 6c 65 20 3d 20 28 6f 73 32 46 69 6c 65 2a 29 69  le = (os2File*)i
9410: 64 3b 0a 20 20 6f 73 32 53 68 6d 4c 69 6e 6b 20  d;.  os2ShmLink 
9420: 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 53 68 6d  *p = pFile->pShm
9430: 4c 69 6e 6b 3b 20 20 20 20 20 20 2f 2a 20 54 68  Link;      /* Th
9440: 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
9450: 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a  being locked */.
9460: 20 20 6f 73 32 53 68 6d 4c 69 6e 6b 20 2a 70 58    os2ShmLink *pX
9470: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9480: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
9490: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20  ooping over all 
94a0: 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 6f 73  siblings */.  os
94b0: 32 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  2ShmNode *pShmNo
94c0: 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
94d0: 3b 20 20 20 2f 2a 20 4f 75 72 20 6e 6f 64 65 20  ;   /* Our node 
94e0: 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  */.  .  assert( 
94f0: 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b  ofst>=0 && ofst+
9500: 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  n<=SQLITE_SHM_NL
9510: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
9520: 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72   n>=1 );.  asser
9530: 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  t( flags==(SQLIT
9540: 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
9550: 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
9560: 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
9570: 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
9580: 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
9590: 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20  XCLUSIVE).      
95a0: 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
95b0: 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
95c0: 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
95d0: 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
95e0: 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
95f0: 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
9600: 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29  SHM_EXCLUSIVE) )
9610: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31  ;.  assert( n==1
9620: 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c   || (flags & SQL
9630: 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
9640: 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b  E)!=0 );..  mask
9650: 20 3d 20 28 75 33 32 29 28 28 31 55 3c 3c 28 6f   = (u32)((1U<<(o
9660: 66 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f  fst+n)) - (1U<<o
9670: 66 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28  fst));.  assert(
9680: 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31   n>1 || mask==(1
9690: 3c 3c 6f 66 73 74 29 20 29 3b 0a 0a 0a 20 20 73  <<ofst) );...  s
96a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
96b0: 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
96c0: 65 78 29 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67  ex);..  if( flag
96d0: 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s & SQLITE_SHM_U
96e0: 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 33 32  NLOCK ){.    u32
96f0: 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a   allMask = 0; /*
9700: 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68   Mask of locks h
9710: 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20  eld by siblings 
9720: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  */..    /* See i
9730: 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68  f any siblings h
9740: 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f  old this same lo
9750: 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58  ck */.    for(pX
9760: 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
9770: 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
9780: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
9790: 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
97a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
97b0: 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
97c0: 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
97d0: 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
97e0: 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b  );.      allMask
97f0: 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
9800: 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
9810: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
9820: 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
9830: 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b  */.    if( (mask
9840: 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29   & allMask)==0 )
9850: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 32  {.      rc = os2
9860: 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
9870: 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
9880: 43 4b 2c 20 6f 66 73 74 2b 4f 53 32 5f 53 48 4d  CK, ofst+OS2_SHM
9890: 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
98a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
98b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
98c0: 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
98d0: 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
98e0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
98f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9900: 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
9910: 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
9920: 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
9930: 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65  ask;.    } .  }e
9940: 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
9950: 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
9960: 44 20 29 7b 0a 20 20 20 20 75 33 32 20 61 6c 6c  D ){.    u32 all
9970: 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20  Shared = 0;  /* 
9980: 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
9990: 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
99a0: 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
99b0: 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  " */..    /* Fin
99c0: 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
99d0: 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
99e0: 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
99f0: 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
9a00: 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20  ..    ** If any 
9a10: 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
9a20: 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
9a30: 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
9a40: 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  d and return.   
9a50: 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   ** SQLITE_BUSY.
9a60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
9a70: 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
9a80: 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
9a90: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
9aa0: 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
9ab0: 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
9ac0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
9ad0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
9ae0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9af0: 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
9b00: 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
9b10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
9b20: 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
9b30: 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
9b40: 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
9b50: 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
9b60: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
9b70: 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
9b80: 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
9b90: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6f  {.        rc = o
9ba0: 73 32 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  s2ShmSystemLock(
9bb0: 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52  pShmNode, _SHM_R
9bc0: 44 4c 43 4b 2c 20 6f 66 73 74 2b 4f 53 32 5f 53  DLCK, ofst+OS2_S
9bd0: 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
9be0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9bf0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
9c00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9c10: 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
9c20: 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  local shared loc
9c30: 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
9c40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
9c50: 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
9c60: 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
9c70: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
9c80: 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73  * Make sure no s
9c90: 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
9ca0: 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68  ns hold locks th
9cb0: 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68  at will block th
9cc0: 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20  is.    ** lock. 
9cd0: 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75   If any do, retu
9ce0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72  rn SQLITE_BUSY r
9cf0: 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a  ight away..    *
9d00: 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
9d10: 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
9d20: 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
9d30: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
9d40: 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
9d50: 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61  )!=0 || (pX->sha
9d60: 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  redMask & mask)!
9d70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
9d80: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
9d90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9da0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
9db0: 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65      /* Get the e
9dc0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61  xclusive locks a
9dd0: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
9de0: 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63  el.  Then if suc
9df0: 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61  cessful.    ** a
9e00: 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63  lso mark the loc
9e10: 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73  al connection as
9e20: 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20   being locked.. 
9e30: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
9e40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
9e50: 20 20 20 20 20 72 63 20 3d 20 6f 73 32 53 68 6d       rc = os2Shm
9e60: 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
9e70: 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c  ode, _SHM_WRLCK,
9e80: 20 6f 66 73 74 2b 4f 53 32 5f 53 48 4d 5f 42 41   ofst+OS2_SHM_BA
9e90: 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66  SE, n);.      if
9ea0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
9eb0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9ec0: 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73  t( (p->sharedMas
9ed0: 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a  k & mask)==0 );.
9ee0: 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d          p->exclM
9ef0: 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
9f00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
9f10: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9f20: 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
9f30: 6d 75 74 65 78 29 3b 0a 20 20 0a 20 20 4f 53 54  mutex);.  .  OST
9f40: 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
9f50: 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64  shmid-%d, pid-%d
9f60: 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78 20 25   got %03x,%03x %
9f70: 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
9f80: 20 70 2d 3e 69 64 2c 20 28 69 6e 74 29 47 65 74   p->id, (int)Get
9f90: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
9fa0: 28 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73  (), p->sharedMas
9fb0: 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a  k, p->exclMask,.
9fc0: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3f 20             rc ? 
9fd0: 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29  "failed" : "ok")
9fe0: 29 3b 0a 0a 20 20 45 52 52 5f 54 52 41 43 45 28  );..  ERR_TRACE(
9ff0: 72 63 2c 20 28 22 6f 73 32 53 68 6d 4c 6f 63 6b  rc, ("os2ShmLock
a000: 3a 20 6f 66 73 74 20 3d 20 25 64 2c 20 6e 20 3d  : ofst = %d, n =
a010: 20 25 64 2c 20 66 6c 61 67 73 20 3d 20 30 78 25   %d, flags = 0x%
a020: 78 20 2d 3e 20 25 64 20 5c 6e 22 2c 20 0a 20 20  x -> %d \n", .  
a030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
a040: 66 73 74 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 72  fst, n, flags, r
a050: 63 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  c)).            
a060: 20 20 20 20 20 20 0a 20 20 72 65 74 75 72 6e 20        .  return 
a070: 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  rc; .}../*.** Im
a080: 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
a090: 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
a0a0: 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
a0b0: 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  ed memory..**.**
a0c0: 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73   All loads and s
a0d0: 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f  tores begun befo
a0e0: 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d  re the barrier m
a0f0: 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66  ust complete bef
a100: 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20  ore.** any load 
a110: 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61  or store begun a
a120: 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72  fter the barrier
a130: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a140: 20 6f 73 32 53 68 6d 42 61 72 72 69 65 72 28 0a   os2ShmBarrier(.
a150: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
a160: 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  id              
a170: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
a180: 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
a190: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
a1a0: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
a1b0: 4d 45 54 45 52 28 69 64 29 3b 0a 20 20 6f 73 32  METER(id);.  os2
a1c0: 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
a1d0: 0a 20 20 6f 73 32 53 68 6d 4c 65 61 76 65 4d 75  .  os2ShmLeaveMu
a1e0: 74 65 78 28 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  tex();.}..#else.
a1f0: 23 20 64 65 66 69 6e 65 20 6f 73 32 53 68 6d 4d  # define os2ShmM
a200: 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ap     0.# defin
a210: 65 20 6f 73 32 53 68 6d 4c 6f 63 6b 20 20 20 20  e os2ShmLock    
a220: 30 0a 23 20 64 65 66 69 6e 65 20 6f 73 32 53 68  0.# define os2Sh
a230: 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66  mBarrier 0.# def
a240: 69 6e 65 20 6f 73 32 53 68 6d 55 6e 6d 61 70 20  ine os2ShmUnmap 
a250: 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    0.#endif /* #i
a260: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a270: 54 5f 57 41 4c 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  T_WAL */.../*.**
a280: 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66   This vector def
a290: 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74  ines all the met
a2a0: 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70  hods that can op
a2b0: 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73  erate on an.** s
a2c0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20  qlite3_file for 
a2d0: 6f 73 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  os2..*/.static c
a2e0: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
a2f0: 6d 65 74 68 6f 64 73 20 6f 73 32 49 6f 4d 65 74  methods os2IoMet
a300: 68 6f 64 20 3d 20 7b 0a 20 20 32 2c 20 20 20 20  hod = {.  2,    
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
a330: 72 73 69 6f 6e 20 2a 2f 0a 20 20 6f 73 32 43 6c  rsion */.  os2Cl
a340: 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
a350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
a360: 6c 6f 73 65 20 2a 2f 0a 20 20 6f 73 32 52 65 61  lose */.  os2Rea
a370: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
a380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
a390: 61 64 20 2a 2f 0a 20 20 6f 73 32 57 72 69 74 65  ad */.  os2Write
a3a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a3b0: 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
a3c0: 65 20 2a 2f 0a 20 20 6f 73 32 54 72 75 6e 63 61  e */.  os2Trunca
a3d0: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
a3e0: 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
a3f0: 61 74 65 20 2a 2f 0a 20 20 6f 73 32 53 79 6e 63  ate */.  os2Sync
a400: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a410: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
a420: 63 20 2a 2f 0a 20 20 6f 73 32 46 69 6c 65 53 69  c */.  os2FileSi
a430: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
a440: 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
a450: 69 7a 65 20 2a 2f 0a 20 20 6f 73 32 4c 6f 63 6b  ize */.  os2Lock
a460: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a470: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
a480: 6b 20 2a 2f 0a 20 20 6f 73 32 55 6e 6c 6f 63 6b  k */.  os2Unlock
a490: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a4a0: 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
a4b0: 6b 20 2a 2f 0a 20 20 6f 73 32 43 68 65 63 6b 52  k */.  os2CheckR
a4c0: 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
a4d0: 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b         /* xCheck
a4e0: 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a  ReservedLock */.
a4f0: 20 20 6f 73 32 46 69 6c 65 43 6f 6e 74 72 6f 6c    os2FileControl
a500: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a510: 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
a520: 6c 20 2a 2f 0a 20 20 6f 73 32 53 65 63 74 6f 72  l */.  os2Sector
a530: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
a540: 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
a550: 72 53 69 7a 65 20 2a 2f 0a 20 20 6f 73 32 44 65  rSize */.  os2De
a560: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
a570: 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44  ics,       /* xD
a580: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
a590: 74 69 63 73 20 2a 2f 0a 20 20 6f 73 32 53 68 6d  tics */.  os2Shm
a5a0: 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
a5b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
a5c0: 6d 4d 61 70 20 2a 2f 0a 20 20 6f 73 32 53 68 6d  mMap */.  os2Shm
a5d0: 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
a5e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
a5f0: 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 6f 73 32 53 68  mLock */.  os2Sh
a600: 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
a610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
a620: 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 6f  hmBarrier */.  o
a630: 73 32 53 68 6d 55 6e 6d 61 70 20 20 20 20 20 20  s2ShmUnmap      
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a650: 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 7d  * xShmUnmap */.}
a660: 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.../***********
a670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a6a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a6b0: 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
a6c0: 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 74 68  e I/O methods th
a6d0: 61 74 20 66 6f 72 6d 20 74 68 65 20 73 71 6c 69  at form the sqli
a6e0: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
a6f0: 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
a700: 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63   next block of c
a710: 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ode implements t
a720: 68 65 20 56 46 53 20 6d 65 74 68 6f 64 73 2e 0a  he VFS methods..
a730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
a780: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65  *.** Create a te
a790: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
a7a0: 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66  e in zBuf.  zBuf
a7b0: 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f   must be big eno
a7c0: 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61  ugh to.** hold a
a7d0: 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  t pVfs->mxPathna
a7e0: 6d 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  me characters..*
a7f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
a800: 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
a810: 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 20 29 7b  f, char *zBuf ){
a820: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
a830: 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
a840: 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
a850: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
a860: 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
a870: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
a880: 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
a890: 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  9";.  int i, j;.
a8a0: 20 20 50 53 5a 20 7a 54 65 6d 70 50 61 74 68 43    PSZ zTempPathC
a8b0: 70 3b 20 20 20 20 20 20 0a 20 20 63 68 61 72 20  p;      .  char 
a8c0: 7a 54 65 6d 70 50 61 74 68 5b 43 43 48 4d 41 58  zTempPath[CCHMAX
a8d0: 50 41 54 48 5d 3b 0a 20 20 55 4c 4f 4e 47 20 75  PATH];.  ULONG u
a8e0: 6c 44 72 69 76 65 4e 75 6d 2c 20 75 6c 44 72 69  lDriveNum, ulDri
a8f0: 76 65 4d 61 70 3b 0a 20 20 0a 20 20 2f 2a 20 49  veMap;.  .  /* I
a900: 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
a910: 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
a920: 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
a930: 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
a940: 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
a950: 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
a960: 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
a970: 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
a980: 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
a990: 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20  ion failing. .  
a9a0: 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
a9b0: 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
a9c0: 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
a9d0: 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  if( sqlite3_temp
a9e0: 5f 64 69 72 65 63 74 6f 72 79 20 29 20 7b 0a 20  _directory ) {. 
a9f0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
aa00: 6e 74 66 28 43 43 48 4d 41 58 50 41 54 48 2d 33  ntf(CCHMAXPATH-3
aa10: 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25  0, zTempPath, "%
aa20: 73 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  s", sqlite3_temp
aa30: 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d  _directory);.  }
aa40: 20 65 6c 73 65 20 69 66 28 20 44 6f 73 53 63 61   else if( DosSca
aa50: 6e 45 6e 76 28 20 28 50 53 5a 29 22 54 45 4d 50  nEnv( (PSZ)"TEMP
aa60: 22 2c 20 20 20 26 7a 54 65 6d 70 50 61 74 68 43  ",   &zTempPathC
aa70: 70 20 29 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20  p ) == NO_ERROR 
aa80: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
aa90: 44 6f 73 53 63 61 6e 45 6e 76 28 20 28 50 53 5a  DosScanEnv( (PSZ
aaa0: 29 22 54 4d 50 22 2c 20 20 20 20 26 7a 54 65 6d  )"TMP",    &zTem
aab0: 70 50 61 74 68 43 70 20 29 20 3d 3d 20 4e 4f 5f  pPathCp ) == NO_
aac0: 45 52 52 4f 52 20 7c 7c 0a 20 20 20 20 20 20 20  ERROR ||.       
aad0: 20 20 20 20 20 20 44 6f 73 53 63 61 6e 45 6e 76        DosScanEnv
aae0: 28 20 28 50 53 5a 29 22 54 4d 50 44 49 52 22 2c  ( (PSZ)"TMPDIR",
aaf0: 20 26 7a 54 65 6d 70 50 61 74 68 43 70 20 29 20   &zTempPathCp ) 
ab00: 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20 29 20 7b 0a  == NO_ERROR ) {.
ab10: 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 50      char *zTempP
ab20: 61 74 68 55 54 46 20 3d 20 63 6f 6e 76 65 72 74  athUTF = convert
ab30: 43 70 50 61 74 68 54 6f 55 74 66 38 28 20 28 63  CpPathToUtf8( (c
ab40: 68 61 72 20 2a 29 7a 54 65 6d 70 50 61 74 68 43  har *)zTempPathC
ab50: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
ab60: 5f 73 6e 70 72 69 6e 74 66 28 43 43 48 4d 41 58  _snprintf(CCHMAX
ab70: 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61  PATH-30, zTempPa
ab80: 74 68 2c 20 22 25 73 22 2c 20 7a 54 65 6d 70 50  th, "%s", zTempP
ab90: 61 74 68 55 54 46 29 3b 0a 20 20 20 20 66 72 65  athUTF);.    fre
aba0: 65 28 20 7a 54 65 6d 70 50 61 74 68 55 54 46 20  e( zTempPathUTF 
abb0: 29 3b 0a 20 20 7d 20 65 6c 73 65 20 69 66 28 20  );.  } else if( 
abc0: 44 6f 73 51 75 65 72 79 43 75 72 72 65 6e 74 44  DosQueryCurrentD
abd0: 69 73 6b 28 20 26 75 6c 44 72 69 76 65 4e 75 6d  isk( &ulDriveNum
abe0: 2c 20 26 75 6c 44 72 69 76 65 4d 61 70 20 29 20  , &ulDriveMap ) 
abf0: 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20 29 20 7b 0a  == NO_ERROR ) {.
ac00: 20 20 20 20 7a 54 65 6d 70 50 61 74 68 5b 30 5d      zTempPath[0]
ac10: 20 3d 20 28 63 68 61 72 29 28 27 41 27 20 2b 20   = (char)('A' + 
ac20: 75 6c 44 72 69 76 65 4e 75 6d 20 2d 20 31 29 3b  ulDriveNum - 1);
ac30: 0a 20 20 20 20 7a 54 65 6d 70 50 61 74 68 5b 31  .    zTempPath[1
ac40: 5d 20 3d 20 27 3a 27 3b 20 0a 20 20 20 20 7a 54  ] = ':'; .    zT
ac50: 65 6d 70 50 61 74 68 5b 32 5d 20 3d 20 27 5c 30  empPath[2] = '\0
ac60: 27 3b 20 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  '; .  } else {. 
ac70: 20 20 20 7a 54 65 6d 70 50 61 74 68 5b 30 5d 20     zTempPath[0] 
ac80: 3d 20 27 5c 30 27 3b 20 0a 20 20 7d 0a 20 20 0a  = '\0'; .  }.  .
ac90: 20 20 2f 2a 20 53 74 72 69 70 20 6f 66 66 20 61    /* Strip off a
aca0: 20 74 72 61 69 6c 69 6e 67 20 73 6c 61 73 68 65   trailing slashe
acb0: 73 20 6f 72 20 62 61 63 6b 73 6c 61 73 68 65 73  s or backslashes
acc0: 2c 20 6f 74 68 65 72 77 69 73 65 20 77 65 20 77  , otherwise we w
acd0: 6f 75 6c 64 20 67 65 74 20 2a 0a 20 20 20 2a 20  ould get *.   * 
ace0: 6d 75 6c 74 69 70 6c 65 20 28 62 61 63 6b 29 73  multiple (back)s
acf0: 6c 61 73 68 65 73 20 77 68 69 63 68 20 63 61 75  lashes which cau
ad00: 73 65 73 20 44 6f 73 4f 70 65 6e 28 29 20 74 6f  ses DosOpen() to
ad10: 20 66 61 69 6c 2e 20 20 20 20 20 20 20 20 20 20   fail.          
ad20: 20 20 20 20 2a 0a 20 20 20 2a 20 54 72 61 69 6c      *.   * Trail
ad30: 69 6e 67 20 73 70 61 63 65 73 20 61 72 65 20 6e  ing spaces are n
ad40: 6f 74 20 61 6c 6c 6f 77 65 64 2c 20 65 69 74 68  ot allowed, eith
ad50: 65 72 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  er.             
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
ad70: 2f 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53  /.  j = sqlite3S
ad80: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61 74  trlen30(zTempPat
ad90: 68 29 3b 0a 20 20 77 68 69 6c 65 28 20 6a 20 3e  h);.  while( j >
ada0: 20 30 20 26 26 20 28 20 7a 54 65 6d 70 50 61 74   0 && ( zTempPat
adb0: 68 5b 6a 2d 31 5d 20 3d 3d 20 27 5c 5c 27 20 7c  h[j-1] == '\\' |
adc0: 7c 20 7a 54 65 6d 70 50 61 74 68 5b 6a 2d 31 5d  | zTempPath[j-1]
add0: 20 3d 3d 20 27 2f 27 20 7c 7c 20 0a 20 20 20 20   == '/' || .    
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adf0: 7a 54 65 6d 70 50 61 74 68 5b 6a 2d 31 5d 20 3d  zTempPath[j-1] =
ae00: 3d 20 27 20 27 20 29 20 29 7b 0a 20 20 20 20 6a  = ' ' ) ){.    j
ae10: 2d 2d 3b 0a 20 20 7d 0a 20 20 7a 54 65 6d 70 50  --;.  }.  zTempP
ae20: 61 74 68 5b 6a 5d 20 3d 20 27 5c 30 27 3b 0a 20  ath[j] = '\0';. 
ae30: 20 0a 20 20 2f 2a 20 57 65 20 75 73 65 20 32 30   .  /* We use 20
ae40: 20 62 79 74 65 73 20 74 6f 20 72 61 6e 64 6f 6d   bytes to random
ae50: 69 7a 65 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a  ize the name */.
ae60: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
ae70: 74 66 28 6e 42 75 66 2d 32 32 2c 20 7a 42 75 66  tf(nBuf-22, zBuf
ae80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ae90: 20 20 20 20 20 22 25 73 5c 5c 22 53 51 4c 49 54       "%s\\"SQLIT
aea0: 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
aeb0: 49 58 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b 0a  IX, zTempPath);.
aec0: 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72    j = sqlite3Str
aed0: 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73  len30(zBuf);.  s
aee0: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
aef0: 73 28 20 32 30 2c 20 26 7a 42 75 66 5b 6a 5d 20  s( 20, &zBuf[j] 
af00: 29 3b 0a 20 20 66 6f 72 28 20 69 20 3d 20 30 3b  );.  for( i = 0;
af10: 20 69 20 3c 20 32 30 3b 20 69 2b 2b 2c 20 6a 2b   i < 20; i++, j+
af20: 2b 20 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d  + ){.    zBuf[j]
af30: 20 3d 20 7a 43 68 61 72 73 5b 20 28 28 75 6e 73   = zChars[ ((uns
af40: 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
af50: 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
af60: 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20  rs)-1) ];.  }.  
af70: 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 0a 20 20  zBuf[j] = 0;..  
af80: 4f 53 54 52 41 43 45 28 28 20 22 54 45 4d 50 20  OSTRACE(( "TEMP 
af90: 46 49 4c 45 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c  FILENAME: %s\n",
afa0: 20 7a 42 75 66 20 29 29 3b 0a 20 20 72 65 74 75   zBuf ));.  retu
afb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
afc0: 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72  ../*.** Turn a r
afd0: 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
afe0: 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74   into a full pat
aff0: 68 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68  hname.  Write th
b000: 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61  e full.** pathna
b010: 6d 65 20 69 6e 74 6f 20 7a 46 75 6c 6c 5b 5d 2e  me into zFull[].
b020: 20 20 7a 46 75 6c 6c 5b 5d 20 77 69 6c 6c 20 62    zFull[] will b
b030: 65 20 61 74 20 6c 65 61 73 74 20 70 56 66 73 2d  e at least pVfs-
b040: 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62  >mxPathname.** b
b050: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  ytes in size..*/
b060: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 32 46  .static int os2F
b070: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73  ullPathname(.  s
b080: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
b090: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ,          /* Po
b0a0: 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a  inter to vfs obj
b0b0: 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
b0c0: 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20  har *zRelative, 
b0d0: 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
b0e0: 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20   relative input 
b0f0: 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  path */.  int nF
b100: 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ull,            
b110: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
b120: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
b130: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61  n bytes */.  cha
b140: 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20  r *zFull        
b150: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
b160: 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
b170: 20 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76    char *zRelativ
b180: 65 43 70 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  eCp = convertUtf
b190: 38 50 61 74 68 54 6f 43 70 28 20 7a 52 65 6c 61  8PathToCp( zRela
b1a0: 74 69 76 65 20 29 3b 0a 20 20 63 68 61 72 20 7a  tive );.  char z
b1b0: 46 75 6c 6c 43 70 5b 43 43 48 4d 41 58 50 41 54  FullCp[CCHMAXPAT
b1c0: 48 5d 20 3d 20 22 5c 30 22 3b 0a 20 20 63 68 61  H] = "\0";.  cha
b1d0: 72 20 2a 7a 46 75 6c 6c 55 54 46 3b 0a 20 20 41  r *zFullUTF;.  A
b1e0: 50 49 52 45 54 20 72 63 20 3d 20 44 6f 73 51 75  PIRET rc = DosQu
b1f0: 65 72 79 50 61 74 68 49 6e 66 6f 28 20 28 50 53  eryPathInfo( (PS
b200: 5a 29 7a 52 65 6c 61 74 69 76 65 43 70 2c 20 46  Z)zRelativeCp, F
b210: 49 4c 5f 51 55 45 52 59 46 55 4c 4c 4e 41 4d 45  IL_QUERYFULLNAME
b220: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
b230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b240: 20 20 20 7a 46 75 6c 6c 43 70 2c 20 43 43 48 4d     zFullCp, CCHM
b250: 41 58 50 41 54 48 20 29 3b 0a 20 20 66 72 65 65  AXPATH );.  free
b260: 28 20 7a 52 65 6c 61 74 69 76 65 43 70 20 29 3b  ( zRelativeCp );
b270: 0a 20 20 7a 46 75 6c 6c 55 54 46 20 3d 20 63 6f  .  zFullUTF = co
b280: 6e 76 65 72 74 43 70 50 61 74 68 54 6f 55 74 66  nvertCpPathToUtf
b290: 38 28 20 7a 46 75 6c 6c 43 70 20 29 3b 0a 20 20  8( zFullCp );.  
b2a0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
b2b0: 28 20 6e 46 75 6c 6c 2c 20 7a 46 75 6c 6c 2c 20  ( nFull, zFull, 
b2c0: 7a 46 75 6c 6c 55 54 46 20 29 3b 0a 20 20 66 72  zFullUTF );.  fr
b2d0: 65 65 28 20 7a 46 75 6c 6c 55 54 46 20 29 3b 0a  ee( zFullUTF );.
b2e0: 20 20 72 65 74 75 72 6e 20 72 63 20 3d 3d 20 4e    return rc == N
b2f0: 4f 5f 45 52 52 4f 52 20 3f 20 53 51 4c 49 54 45  O_ERROR ? SQLITE
b300: 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45  _OK : SQLITE_IOE
b310: 52 52 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70  RR;.}.../*.** Op
b320: 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  en a file..*/.st
b330: 61 74 69 63 20 69 6e 74 20 6f 73 32 4f 70 65 6e  atic int os2Open
b340: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
b350: 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
b360: 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f    /* Not used */
b370: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b380: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
b390: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
b3a0: 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  file (UTF-8) */.
b3b0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
b3c0: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
b3d0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53 51 4c  /* Write the SQL
b3e0: 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ite file handle 
b3f0: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
b400: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
b410: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
b420: 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20  mode flags */.  
b430: 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20  int *pOutFlags  
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b450: 20 53 74 61 74 75 73 20 72 65 74 75 72 6e 20 66   Status return f
b460: 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 46 49  lags */.){.  HFI
b470: 4c 45 20 68 3b 0a 20 20 55 4c 4f 4e 47 20 75 6c  LE h;.  ULONG ul
b480: 4f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 0a 20  OpenFlags = 0;. 
b490: 20 55 4c 4f 4e 47 20 75 6c 4f 70 65 6e 4d 6f 64   ULONG ulOpenMod
b4a0: 65 20 3d 20 30 3b 0a 20 20 55 4c 4f 4e 47 20 75  e = 0;.  ULONG u
b4b0: 6c 41 63 74 69 6f 6e 20 3d 20 30 3b 0a 20 20 55  lAction = 0;.  U
b4c0: 4c 4f 4e 47 20 72 63 3b 0a 20 20 6f 73 32 46 69  LONG rc;.  os2Fi
b4d0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 6f 73 32  le *pFile = (os2
b4e0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 6f 6e 73  File*)id;.  cons
b4f0: 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d  t char *zUtf8Nam
b500: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 63 68 61  e = zName;.  cha
b510: 72 20 2a 7a 4e 61 6d 65 43 70 3b 0a 20 20 63 68  r *zNameCp;.  ch
b520: 61 72 20 20 7a 54 6d 70 6e 61 6d 65 5b 43 43 48  ar  zTmpname[CCH
b530: 4d 41 58 50 41 54 48 5d 3b 0a 0a 20 20 69 6e 74  MAXPATH];..  int
b540: 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20   isExclusive  = 
b550: 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
b560: 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b  OPEN_EXCLUSIVE);
b570: 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20  .  int isCreate 
b580: 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
b590: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
b5a0: 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  E);.  int isRead
b5b0: 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
b5c0: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
b5d0: 41 44 57 52 49 54 45 29 3b 0a 23 69 66 6e 64 65  ADWRITE);.#ifnde
b5e0: 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69  f NDEBUG.  int i
b5f0: 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66  sDelete     = (f
b600: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
b610: 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
b620: 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f  );.  int isReado
b630: 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26  nly   = (flags &
b640: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
b650: 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 65 54  DONLY);.  int eT
b660: 79 70 65 20 20 20 20 20 20 20 20 3d 20 28 66 6c  ype        = (fl
b670: 61 67 73 20 26 20 30 78 46 46 46 46 46 46 30 30  ags & 0xFFFFFF00
b680: 29 3b 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a  );.  int isOpenJ
b690: 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61  ournal = (isCrea
b6a0: 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20  te && (.        
b6b0: 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
b6c0: 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
b6d0: 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
b6e0: 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
b6f0: 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  IN_JOURNAL .    
b700: 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
b710: 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b  E_OPEN_WAL.  ));
b720: 0a 23 65 6e 64 69 66 0a 0a 20 20 55 4e 55 53 45  .#endif..  UNUSE
b730: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
b740: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  );.  assert( id!
b750: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  =0 );..  /* Chec
b760: 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  k the following 
b770: 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
b780: 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rue: .  **.  ** 
b790: 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e    (a) Exactly on
b7a0: 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49  e of the READWRI
b7b0: 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20  TE and READONLY 
b7c0: 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65  flags must be se
b7d0: 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28  t, and .  **   (
b7e0: 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20  b) if CREATE is 
b7f0: 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52  set, then READWR
b800: 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ITE must also be
b810: 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20   set, and.  **  
b820: 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56   (c) if EXCLUSIV
b830: 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
b840: 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
b850: 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28  be set..  **   (
b860: 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c  d) if DELETEONCL
b870: 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  OSE is set, then
b880: 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
b890: 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  o be set..  */. 
b8a0: 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f   assert((isReado
b8b0: 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  nly==0 || isRead
b8c0: 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73  Write==0) && (is
b8d0: 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52  ReadWrite || isR
b8e0: 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73  eadonly));.  ass
b8f0: 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20  ert(isCreate==0 
b900: 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b  || isReadWrite);
b910: 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c  .  assert(isExcl
b920: 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72  usive==0 || isCr
b930: 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  eate);.  assert(
b940: 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69  isDelete==0 || i
b950: 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20  sCreate);..  /* 
b960: 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69  The main DB, mai
b970: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66  n journal, WAL f
b980: 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a  ile and master j
b990: 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72  ournal are never
b9a0: 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63   .  ** automatic
b9b0: 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f  ally deleted. No
b9c0: 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20  r are they ever 
b9d0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
b9e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
b9f0: 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
ba00: 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
ba10: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
ba20: 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  B );.  assert( (
ba30: 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
ba40: 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
ba50: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
ba60: 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
ba70: 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
ba80: 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
ba90: 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
baa0: 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b  ASTER_JOURNAL );
bab0: 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
bac0: 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
bad0: 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
bae0: 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20  _OPEN_WAL );..  
baf0: 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
bb00: 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68  he upper layer h
bb10: 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68  as set one of th
bb20: 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c  e "file-type" fl
bb30: 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ags. */.  assert
bb40: 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
bb50: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20  OPEN_MAIN_DB    
bb60: 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
bb70: 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
bb80: 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
bb90: 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
bba0: 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54  IN_JOURNAL || eT
bbb0: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
bbc0: 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20  _TEMP_JOURNAL . 
bbd0: 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
bbe0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
bbf0: 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70  OURNAL   || eTyp
bc00: 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
bc10: 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20  ASTER_JOURNAL . 
bc20: 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
bc30: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
bc40: 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70  SIENT_DB || eTyp
bc50: 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
bc60: 41 4c 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65  AL.  );..  memse
bc70: 74 28 20 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  t( pFile, 0, siz
bc80: 65 6f 66 28 2a 70 46 69 6c 65 29 20 29 3b 0a 20  eof(*pFile) );. 
bc90: 20 70 46 69 6c 65 2d 3e 68 20 3d 20 28 48 46 49   pFile->h = (HFI
bca0: 4c 45 29 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  LE)-1;..  /* If 
bcb0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
bcc0: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
bcd0: 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65  tion is NULL, ge
bce0: 6e 65 72 61 74 65 20 61 20 0a 20 20 2a 2a 20 74  nerate a .  ** t
bcf0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
bd00: 6d 65 20 74 6f 20 75 73 65 20 0a 20 20 2a 2f 0a  me to use .  */.
bd10: 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65    if( !zUtf8Name
bd20: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 69   ){.    assert(i
bd30: 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70  sDelete && !isOp
bd40: 65 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  enJournal);.    
bd50: 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65  rc = getTempname
bd60: 28 43 43 48 4d 41 58 50 41 54 48 2c 20 7a 54 6d  (CCHMAXPATH, zTm
bd70: 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pname);.    if( 
bd80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
bd90: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
bda0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66  ;.    }.    zUtf
bdb0: 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65  8Name = zTmpname
bdc0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52  ;.  }..  if( isR
bdd0: 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
bde0: 75 6c 4f 70 65 6e 4d 6f 64 65 20 7c 3d 20 4f 50  ulOpenMode |= OP
bdf0: 45 4e 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  EN_ACCESS_READWR
be00: 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ITE;.  }else{.  
be10: 20 20 75 6c 4f 70 65 6e 4d 6f 64 65 20 7c 3d 20    ulOpenMode |= 
be20: 4f 50 45 4e 5f 41 43 43 45 53 53 5f 52 45 41 44  OPEN_ACCESS_READ
be30: 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ONLY;.  }..  /* 
be40: 4f 70 65 6e 20 69 6e 20 72 61 6e 64 6f 6d 20 61  Open in random a
be50: 63 63 65 73 73 20 6d 6f 64 65 20 66 6f 72 20 70  ccess mode for p
be60: 6f 73 73 69 62 6c 79 20 62 65 74 74 65 72 20 73  ossibly better s
be70: 70 65 65 64 2e 20 20 41 6c 6c 6f 77 20 66 75 6c  peed.  Allow ful
be80: 6c 0a 20 20 2a 2a 20 73 68 61 72 69 6e 67 20 62  l.  ** sharing b
be90: 65 63 61 75 73 65 20 66 69 6c 65 20 6c 6f 63 6b  ecause file lock
bea0: 73 20 77 69 6c 6c 20 70 72 6f 76 69 64 65 20 65  s will provide e
beb0: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
bec0: 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 20 20 2a  when needed..  *
bed0: 2a 20 54 68 65 20 68 61 6e 64 6c 65 20 73 68 6f  * The handle sho
bee0: 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e 68 65 72  uld not be inher
bef0: 69 74 65 64 20 62 79 20 63 68 69 6c 64 20 70 72  ited by child pr
bf00: 6f 63 65 73 73 65 73 20 61 6e 64 20 77 65 20 64  ocesses and we d
bf10: 6f 6e 27 74 20 0a 20 20 2a 2a 20 77 61 6e 74 20  on't .  ** want 
bf20: 70 6f 70 75 70 73 20 66 72 6f 6d 20 74 68 65 20  popups from the 
bf30: 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 20 68  critical error h
bf40: 61 6e 64 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 75  andler..  */.  u
bf50: 6c 4f 70 65 6e 4d 6f 64 65 20 7c 3d 20 4f 50 45  lOpenMode |= OPE
bf60: 4e 5f 46 4c 41 47 53 5f 52 41 4e 44 4f 4d 20 7c  N_FLAGS_RANDOM |
bf70: 20 4f 50 45 4e 5f 53 48 41 52 45 5f 44 45 4e 59   OPEN_SHARE_DENY
bf80: 4e 4f 4e 45 20 7c 20 0a 20 20 20 20 20 20 20 20  NONE | .        
bf90: 20 20 20 20 20 20 20 20 4f 50 45 4e 5f 46 4c 41          OPEN_FLA
bfa0: 47 53 5f 4e 4f 49 4e 48 45 52 49 54 20 7c 20 4f  GS_NOINHERIT | O
bfb0: 50 45 4e 5f 46 4c 41 47 53 5f 46 41 49 4c 5f 4f  PEN_FLAGS_FAIL_O
bfc0: 4e 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 53  N_ERROR;..  /* S
bfd0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
bfe0: 53 49 56 45 20 69 73 20 75 73 65 64 20 74 6f 20  SIVE is used to 
bff0: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61  make sure that a
c000: 20 6e 65 77 20 66 69 6c 65 20 69 73 20 0a 20 20   new file is .  
c010: 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69  ** created. SQLi
c020: 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69  te doesn't use i
c030: 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65  t to indicate "e
c040: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 22  xclusive access"
c050: 20 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20   .  ** as it is 
c060: 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f  usually understo
c070: 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  od..  */.  if( i
c080: 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20  sExclusive ){.  
c090: 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e    /* Creates a n
c0a0: 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66  ew file, only if
c0b0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
c0c0: 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20  eady exist. */. 
c0d0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
c0e0: 65 20 65 78 69 73 74 73 2c 20 69 74 20 66 61 69  e exists, it fai
c0f0: 6c 73 2e 20 2a 2f 0a 20 20 20 20 75 6c 4f 70 65  ls. */.    ulOpe
c100: 6e 46 6c 61 67 73 20 7c 3d 20 4f 50 45 4e 5f 41  nFlags |= OPEN_A
c110: 43 54 49 4f 4e 5f 43 52 45 41 54 45 5f 49 46 5f  CTION_CREATE_IF_
c120: 4e 45 57 20 7c 20 4f 50 45 4e 5f 41 43 54 49 4f  NEW | OPEN_ACTIO
c130: 4e 5f 46 41 49 4c 5f 49 46 5f 45 58 49 53 54 53  N_FAIL_IF_EXISTS
c140: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73  ;.  }else if( is
c150: 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a  Create ){.    /*
c160: 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66   Open existing f
c170: 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69  ile, or create i
c180: 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69  f it doesn't exi
c190: 73 74 20 2a 2f 0a 20 20 20 20 75 6c 4f 70 65 6e  st */.    ulOpen
c1a0: 46 6c 61 67 73 20 7c 3d 20 4f 50 45 4e 5f 41 43  Flags |= OPEN_AC
c1b0: 54 49 4f 4e 5f 43 52 45 41 54 45 5f 49 46 5f 4e  TION_CREATE_IF_N
c1c0: 45 57 20 7c 20 4f 50 45 4e 5f 41 43 54 49 4f 4e  EW | OPEN_ACTION
c1d0: 5f 4f 50 45 4e 5f 49 46 5f 45 58 49 53 54 53 3b  _OPEN_IF_EXISTS;
c1e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
c1f0: 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f   Opens a file, o
c200: 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73 74 73  nly if it exists
c210: 2e 20 2a 2f 0a 20 20 20 20 75 6c 4f 70 65 6e 46  . */.    ulOpenF
c220: 6c 61 67 73 20 7c 3d 20 4f 50 45 4e 5f 41 43 54  lags |= OPEN_ACT
c230: 49 4f 4e 5f 46 41 49 4c 5f 49 46 5f 4e 45 57 20  ION_FAIL_IF_NEW 
c240: 7c 20 4f 50 45 4e 5f 41 43 54 49 4f 4e 5f 4f 50  | OPEN_ACTION_OP
c250: 45 4e 5f 49 46 5f 45 58 49 53 54 53 3b 0a 20 20  EN_IF_EXISTS;.  
c260: 7d 0a 0a 20 20 7a 4e 61 6d 65 43 70 20 3d 20 63  }..  zNameCp = c
c270: 6f 6e 76 65 72 74 55 74 66 38 50 61 74 68 54 6f  onvertUtf8PathTo
c280: 43 70 28 20 7a 55 74 66 38 4e 61 6d 65 20 29 3b  Cp( zUtf8Name );
c290: 0a 20 20 72 63 20 3d 20 44 6f 73 4f 70 65 6e 28  .  rc = DosOpen(
c2a0: 20 28 50 53 5a 29 7a 4e 61 6d 65 43 70 2c 0a 20   (PSZ)zNameCp,. 
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
c2c0: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
c2d0: 20 20 20 26 75 6c 41 63 74 69 6f 6e 2c 0a 20 20     &ulAction,.  
c2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 4c                0L
c2f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c300: 20 20 46 49 4c 45 5f 4e 4f 52 4d 41 4c 2c 0a 20    FILE_NORMAL,. 
c310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
c320: 6c 4f 70 65 6e 46 6c 61 67 73 2c 0a 20 20 20 20  lOpenFlags,.    
c330: 20 20 20 20 20 20 20 20 20 20 20 20 75 6c 4f 70              ulOp
c340: 65 6e 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20  enMode,.        
c350: 20 20 20 20 20 20 20 20 28 50 45 41 4f 50 32 29          (PEAOP2)
c360: 4e 55 4c 4c 20 29 3b 0a 20 20 66 72 65 65 28 20  NULL );.  free( 
c370: 7a 4e 61 6d 65 43 70 20 29 3b 0a 0a 20 20 69 66  zNameCp );..  if
c380: 28 20 72 63 20 21 3d 20 4e 4f 5f 45 52 52 4f 52  ( rc != NO_ERROR
c390: 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
c3a0: 28 20 22 4f 50 45 4e 20 49 6e 76 61 6c 69 64 20  ( "OPEN Invalid 
c3b0: 68 61 6e 64 6c 65 20 72 63 3d 25 64 3a 20 7a 4e  handle rc=%d: zN
c3c0: 61 6d 65 3d 25 73 2c 20 75 6c 41 63 74 69 6f 6e  ame=%s, ulAction
c3d0: 3d 25 23 6c 78 2c 20 75 6c 46 6c 61 67 73 3d 25  =%#lx, ulFlags=%
c3e0: 23 6c 78 2c 20 75 6c 4d 6f 64 65 3d 25 23 6c 78  #lx, ulMode=%#lx
c3f0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
c400: 20 20 20 72 63 2c 20 7a 55 74 66 38 4e 61 6d 65     rc, zUtf8Name
c410: 2c 20 75 6c 41 63 74 69 6f 6e 2c 20 75 6c 4f 70  , ulAction, ulOp
c420: 65 6e 46 6c 61 67 73 2c 20 75 6c 4f 70 65 6e 4d  enFlags, ulOpenM
c430: 6f 64 65 20 29 29 3b 0a 0a 20 20 20 20 69 66 28  ode ));..    if(
c440: 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
c450: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6f 73 32        return os2
c460: 4f 70 65 6e 28 20 70 56 66 73 2c 20 7a 4e 61 6d  Open( pVfs, zNam
c470: 65 2c 20 69 64 2c 0a 20 20 20 20 20 20 20 20 20  e, id,.         
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 66               ((f
c490: 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  lags|SQLITE_OPEN
c4a0: 5f 52 45 41 44 4f 4e 4c 59 29 26 7e 28 53 51 4c  _READONLY)&~(SQL
c4b0: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
c4c0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
c4d0: 57 52 49 54 45 29 29 2c 0a 20 20 20 20 20 20 20  WRITE)),.       
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
c4f0: 4f 75 74 46 6c 61 67 73 20 29 3b 0a 20 20 20 20  OutFlags );.    
c500: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
c510: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
c520: 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  PEN;.    }.  }..
c530: 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20    if( pOutFlags 
c540: 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  ){.    *pOutFlag
c550: 73 20 3d 20 69 73 52 65 61 64 57 72 69 74 65 20  s = isReadWrite 
c560: 3f 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ? SQLITE_OPEN_RE
c570: 41 44 57 52 49 54 45 20 3a 20 53 51 4c 49 54 45  ADWRITE : SQLITE
c580: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
c590: 20 20 7d 0a 0a 20 20 6f 73 32 46 75 6c 6c 50 61    }..  os2FullPa
c5a0: 74 68 6e 61 6d 65 28 20 70 56 66 73 2c 20 7a 55  thname( pVfs, zU
c5b0: 74 66 38 4e 61 6d 65 2c 20 73 69 7a 65 6f 66 28  tf8Name, sizeof(
c5c0: 20 7a 54 6d 70 6e 61 6d 65 20 29 2c 20 7a 54 6d   zTmpname ), zTm
c5d0: 70 6e 61 6d 65 20 29 3b 0a 20 20 70 46 69 6c 65  pname );.  pFile
c5e0: 2d 3e 7a 46 75 6c 6c 50 61 74 68 43 70 20 3d 20  ->zFullPathCp = 
c5f0: 63 6f 6e 76 65 72 74 55 74 66 38 50 61 74 68 54  convertUtf8PathT
c600: 6f 43 70 28 20 7a 54 6d 70 6e 61 6d 65 20 29 3b  oCp( zTmpname );
c610: 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  .  pFile->pMetho
c620: 64 20 3d 20 26 6f 73 32 49 6f 4d 65 74 68 6f 64  d = &os2IoMethod
c630: 3b 0a 20 20 70 46 69 6c 65 2d 3e 66 6c 61 67 73  ;.  pFile->flags
c640: 20 3d 20 66 6c 61 67 73 3b 0a 20 20 70 46 69 6c   = flags;.  pFil
c650: 65 2d 3e 68 20 3d 20 68 3b 0a 0a 20 20 4f 70 65  e->h = h;..  Ope
c660: 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
c670: 4f 53 54 52 41 43 45 28 28 20 22 4f 50 45 4e 20  OSTRACE(( "OPEN 
c680: 25 64 20 70 4f 75 74 46 6c 61 67 73 3d 25 64 5c  %d pOutFlags=%d\
c690: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 4f  n", pFile->h, pO
c6a0: 75 74 46 6c 61 67 73 20 29 29 3b 0a 20 20 72 65  utFlags ));.  re
c6b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c6c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
c6d0: 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a  the named file..
c6e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73  */.static int os
c6f0: 32 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74  2Delete(.  sqlit
c700: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c720: 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
c730: 20 6f 73 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   os2 */.  const 
c740: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c760: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
c770: 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
c780: 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20 20 20  int syncDir     
c790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7a0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73         /* Not us
c7b0: 65 64 20 6f 6e 20 6f 73 32 20 2a 2f 0a 29 7b 0a  ed on os2 */.){.
c7c0: 20 20 41 50 49 52 45 54 20 72 63 3b 0a 20 20 63    APIRET rc;.  c
c7d0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 43 70  har *zFilenameCp
c7e0: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
c7f0: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
c800: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 20  TE_IOERR_DELETE 
c810: 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 43 70  );.  zFilenameCp
c820: 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 50 61   = convertUtf8Pa
c830: 74 68 54 6f 43 70 28 20 7a 46 69 6c 65 6e 61 6d  thToCp( zFilenam
c840: 65 20 29 3b 0a 20 20 72 63 20 3d 20 44 6f 73 44  e );.  rc = DosD
c850: 65 6c 65 74 65 28 20 28 50 53 5a 29 7a 46 69 6c  elete( (PSZ)zFil
c860: 65 6e 61 6d 65 43 70 20 29 3b 0a 20 20 66 72 65  enameCp );.  fre
c870: 65 28 20 7a 46 69 6c 65 6e 61 6d 65 43 70 20 29  e( zFilenameCp )
c880: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 20 22 44  ;.  OSTRACE(( "D
c890: 45 4c 45 54 45 20 5c 22 25 73 5c 22 5c 6e 22 2c  ELETE \"%s\"\n",
c8a0: 20 7a 46 69 6c 65 6e 61 6d 65 20 29 29 3b 0a 20   zFilename ));. 
c8b0: 20 72 65 74 75 72 6e 20 28 72 63 20 3d 3d 20 4e   return (rc == N
c8c0: 4f 5f 45 52 52 4f 52 20 7c 7c 0a 20 20 20 20 20  O_ERROR ||.     
c8d0: 20 20 20 20 20 72 63 20 3d 3d 20 45 52 52 4f 52       rc == ERROR
c8e0: 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _FILE_NOT_FOUND 
c8f0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ||.          rc 
c900: 3d 3d 20 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  == ERROR_PATH_NO
c910: 54 5f 46 4f 55 4e 44 20 29 20 3f 20 53 51 4c 49  T_FOUND ) ? SQLI
c920: 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49  TE_OK : SQLITE_I
c930: 4f 45 52 52 5f 44 45 4c 45 54 45 3b 0a 7d 0a 0a  OERR_DELETE;.}..
c940: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20  /*.** Check the 
c950: 65 78 69 73 74 61 6e 63 65 20 61 6e 64 20 73 74  existance and st
c960: 61 74 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a  atus of a file..
c970: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73  */.static int os
c980: 32 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74  2Access(.  sqlit
c990: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
c9a0: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
c9b0: 20 6f 6e 20 6f 73 32 20 2a 2f 0a 20 20 63 6f 6e   on os2 */.  con
c9c0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
c9d0: 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  me,    /* Name o
c9e0: 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  f file to check 
c9f0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ca10: 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74  * Type of test t
ca20: 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66  o make on this f
ca30: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f  ile */.  int *pO
ca40: 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
ca50: 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75     /* Write resu
ca60: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
ca70: 20 41 50 49 52 45 54 20 72 63 3b 0a 20 20 46 49   APIRET rc;.  FI
ca80: 4c 45 53 54 41 54 55 53 33 20 66 73 74 73 33 43  LESTATUS3 fsts3C
ca90: 6f 6e 66 69 67 49 6e 66 6f 3b 0a 20 20 63 68 61  onfigInfo;.  cha
caa0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 43 70 3b 0a  r *zFilenameCp;.
cab0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
cac0: 54 45 52 28 70 56 66 73 29 3b 0a 20 20 53 69 6d  TER(pVfs);.  Sim
cad0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
cae0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
caf0: 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 0a  R_ACCESS; );.  .
cb00: 20 20 7a 46 69 6c 65 6e 61 6d 65 43 70 20 3d 20    zFilenameCp = 
cb10: 63 6f 6e 76 65 72 74 55 74 66 38 50 61 74 68 54  convertUtf8PathT
cb20: 6f 43 70 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29  oCp( zFilename )
cb30: 3b 0a 20 20 72 63 20 3d 20 44 6f 73 51 75 65 72  ;.  rc = DosQuer
cb40: 79 50 61 74 68 49 6e 66 6f 28 20 28 50 53 5a 29  yPathInfo( (PSZ)
cb50: 7a 46 69 6c 65 6e 61 6d 65 43 70 2c 20 46 49 4c  zFilenameCp, FIL
cb60: 5f 53 54 41 4e 44 41 52 44 2c 0a 20 20 20 20 20  _STANDARD,.     
cb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb80: 20 20 20 20 26 66 73 74 73 33 43 6f 6e 66 69 67      &fsts3Config
cb90: 49 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 46 49 4c  Info, sizeof(FIL
cba0: 45 53 54 41 54 55 53 33 29 20 29 3b 0a 20 20 66  ESTATUS3) );.  f
cbb0: 72 65 65 28 20 7a 46 69 6c 65 6e 61 6d 65 43 70  ree( zFilenameCp
cbc0: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 20   );.  OSTRACE(( 
cbd0: 22 41 43 43 45 53 53 20 66 73 74 73 33 43 6f 6e  "ACCESS fsts3Con
cbe0: 66 69 67 49 6e 66 6f 2e 61 74 74 72 46 69 6c 65  figInfo.attrFile
cbf0: 3d 25 64 20 66 6c 61 67 73 3d 25 64 20 72 63 3d  =%d flags=%d rc=
cc00: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
cc10: 20 20 20 66 73 74 73 33 43 6f 6e 66 69 67 49 6e     fsts3ConfigIn
cc20: 66 6f 2e 61 74 74 72 46 69 6c 65 2c 20 66 6c 61  fo.attrFile, fla
cc30: 67 73 2c 20 72 63 20 29 29 3b 0a 0a 20 20 73 77  gs, rc ));..  sw
cc40: 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20  itch( flags ){. 
cc50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
cc60: 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20  CCESS_EXISTS:.  
cc70: 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51      /* For an SQ
cc80: 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
cc90: 54 53 20 71 75 65 72 79 2c 20 74 72 65 61 74 20  TS query, treat 
cca0: 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69  a zero-length fi
ccb0: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69  le.      ** as i
ccc0: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  f it does not ex
ccd0: 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
cce0: 20 20 20 20 69 66 28 20 66 73 74 73 33 43 6f 6e      if( fsts3Con
ccf0: 66 69 67 49 6e 66 6f 2e 63 62 46 69 6c 65 20 3d  figInfo.cbFile =
cd00: 3d 20 30 20 29 20 0a 20 20 20 20 20 20 20 20 72  = 0 ) .        r
cd10: 63 20 3d 20 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  c = ERROR_FILE_N
cd20: 4f 54 5f 46 4f 55 4e 44 3b 0a 20 20 20 20 20 20  OT_FOUND;.      
cd30: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
cd40: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
cd50: 41 44 3a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  AD:.      break;
cd60: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
cd70: 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
cd80: 45 3a 0a 20 20 20 20 20 20 69 66 28 20 66 73 74  E:.      if( fst
cd90: 73 33 43 6f 6e 66 69 67 49 6e 66 6f 2e 61 74 74  s3ConfigInfo.att
cda0: 72 46 69 6c 65 20 26 20 46 49 4c 45 5f 52 45 41  rFile & FILE_REA
cdb0: 44 4f 4e 4c 59 20 29 0a 20 20 20 20 20 20 20 20  DONLY ).        
cdc0: 72 63 20 3d 20 45 52 52 4f 52 5f 41 43 43 45 53  rc = ERROR_ACCES
cdd0: 53 5f 44 45 4e 49 45 44 3b 0a 20 20 20 20 20 20  S_DENIED;.      
cde0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
cdf0: 6c 74 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 45  lt:.      rc = E
ce00: 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f  RROR_FILE_NOT_FO
ce10: 55 4e 44 3b 0a 20 20 20 20 20 20 61 73 73 65 72  UND;.      asser
ce20: 74 28 20 21 22 49 6e 76 61 6c 69 64 20 66 6c 61  t( !"Invalid fla
ce30: 67 73 20 61 72 67 75 6d 65 6e 74 22 20 29 3b 0a  gs argument" );.
ce40: 20 20 7d 0a 0a 20 20 2a 70 4f 75 74 20 3d 20 28    }..  *pOut = (
ce50: 72 63 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 29 3b  rc == NO_ERROR);
ce60: 0a 20 20 4f 53 54 52 41 43 45 28 28 20 22 41 43  .  OSTRACE(( "AC
ce70: 43 45 53 53 20 25 73 20 66 6c 61 67 73 20 25 64  CESS %s flags %d
ce80: 3a 20 72 63 3d 25 64 5c 6e 22 2c 20 7a 46 69 6c  : rc=%d\n", zFil
ce90: 65 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 2a 70  ename, flags, *p
cea0: 4f 75 74 20 29 29 3b 0a 0a 20 20 72 65 74 75 72  Out ));..  retur
ceb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
cec0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ced0: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
cee0: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
cef0: 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
cf00: 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
cf10: 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
cf20: 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
cf30: 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
cf40: 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
cf50: 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
cf60: 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49  rary..*/./*.** I
cf70: 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
cf80: 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
cf90: 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
cfa0: 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
cfb0: 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
cfc0: 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
cfd0: 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
cfe0: 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74  d library..*/.st
cff0: 61 74 69 63 20 76 6f 69 64 20 2a 6f 73 32 44 6c  atic void *os2Dl
d000: 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
d010: 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68   *pVfs, const ch
d020: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
d030: 20 20 48 4d 4f 44 55 4c 45 20 68 6d 6f 64 3b 0a    HMODULE hmod;.
d040: 20 20 41 50 49 52 45 54 20 72 63 3b 0a 20 20 63    APIRET rc;.  c
d050: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 43 70  har *zFilenameCp
d060: 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 50 61   = convertUtf8Pa
d070: 74 68 54 6f 43 70 28 7a 46 69 6c 65 6e 61 6d 65  thToCp(zFilename
d080: 29 3b 0a 20 20 72 63 20 3d 20 44 6f 73 4c 6f 61  );.  rc = DosLoa
d090: 64 4d 6f 64 75 6c 65 28 4e 55 4c 4c 2c 20 30 2c  dModule(NULL, 0,
d0a0: 20 28 50 53 5a 29 7a 46 69 6c 65 6e 61 6d 65 43   (PSZ)zFilenameC
d0b0: 70 2c 20 26 68 6d 6f 64 29 3b 0a 20 20 66 72 65  p, &hmod);.  fre
d0c0: 65 28 7a 46 69 6c 65 6e 61 6d 65 43 70 29 3b 0a  e(zFilenameCp);.
d0d0: 20 20 72 65 74 75 72 6e 20 72 63 20 21 3d 20 4e    return rc != N
d0e0: 4f 5f 45 52 52 4f 52 20 3f 20 30 20 3a 20 28 76  O_ERROR ? 0 : (v
d0f0: 6f 69 64 2a 29 68 6d 6f 64 3b 0a 7d 0a 2f 2a 0a  oid*)hmod;.}./*.
d100: 2a 2a 20 41 20 6e 6f 2d 6f 70 20 73 69 6e 63 65  ** A no-op since
d110: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
d120: 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 74  is returned on t
d130: 68 65 20 44 6f 73 4c 6f 61 64 4d 6f 64 75 6c 65  he DosLoadModule
d140: 20 63 61 6c 6c 2e 0a 2a 2a 20 6f 73 32 44 6c 6f   call..** os2Dlo
d150: 70 65 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  pen returns zero
d160: 20 69 66 20 44 6f 73 4c 6f 61 64 4d 6f 64 75 6c   if DosLoadModul
d170: 65 20 69 73 20 6e 6f 74 20 73 75 63 63 65 73 73  e is not success
d180: 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ful..*/.static v
d190: 6f 69 64 20 6f 73 32 44 6c 45 72 72 6f 72 28 73  oid os2DlError(s
d1a0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
d1b0: 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
d1c0: 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 2f 2a 20 6e   *zBufOut){./* n
d1d0: 6f 2d 6f 70 20 2a 2f 0a 7d 0a 73 74 61 74 69 63  o-op */.}.static
d1e0: 20 76 6f 69 64 20 28 2a 6f 73 32 44 6c 53 79 6d   void (*os2DlSym
d1f0: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
d200: 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c  fs, void *pHandl
d210: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
d220: 53 79 6d 62 6f 6c 29 29 28 76 6f 69 64 29 7b 0a  Symbol))(void){.
d230: 20 20 50 46 4e 20 70 66 6e 3b 0a 20 20 41 50 49    PFN pfn;.  API
d240: 52 45 54 20 72 63 3b 0a 20 20 72 63 20 3d 20 44  RET rc;.  rc = D
d250: 6f 73 51 75 65 72 79 50 72 6f 63 41 64 64 72 28  osQueryProcAddr(
d260: 28 48 4d 4f 44 55 4c 45 29 70 48 61 6e 64 6c 65  (HMODULE)pHandle
d270: 2c 20 30 4c 2c 20 28 50 53 5a 29 7a 53 79 6d 62  , 0L, (PSZ)zSymb
d280: 6f 6c 2c 20 26 70 66 6e 29 3b 0a 20 20 69 66 28  ol, &pfn);.  if(
d290: 20 72 63 20 21 3d 20 4e 4f 5f 45 52 52 4f 52 20   rc != NO_ERROR 
d2a0: 29 7b 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65  ){.    /* if the
d2b0: 20 73 79 6d 62 6f 6c 20 69 74 73 65 6c 66 20 77   symbol itself w
d2c0: 61 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 73 65  as not found, se
d2d0: 61 72 63 68 20 61 67 61 69 6e 20 66 6f 72 20 74  arch again for t
d2e0: 68 65 20 73 61 6d 65 0a 20 20 20 20 20 2a 20 73  he same.     * s
d2f0: 79 6d 62 6f 6c 20 77 69 74 68 20 61 6e 20 65 78  ymbol with an ex
d300: 74 72 61 20 75 6e 64 65 72 73 63 6f 72 65 2c 20  tra underscore, 
d310: 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 6e 65  that might be ne
d320: 65 64 65 64 20 64 65 70 65 6e 64 69 6e 67 0a 20  eded depending. 
d330: 20 20 20 20 2a 20 6f 6e 20 74 68 65 20 63 61 6c      * on the cal
d340: 6c 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 20  ling convention 
d350: 2a 2f 0a 20 20 20 20 63 68 61 72 20 5f 7a 53 79  */.    char _zSy
d360: 6d 62 6f 6c 5b 32 35 36 5d 20 3d 20 22 5f 22 3b  mbol[256] = "_";
d370: 0a 20 20 20 20 73 74 72 6e 63 61 74 28 5f 7a 53  .    strncat(_zS
d380: 79 6d 62 6f 6c 2c 20 7a 53 79 6d 62 6f 6c 2c 20  ymbol, zSymbol, 
d390: 32 35 34 29 3b 0a 20 20 20 20 72 63 20 3d 20 44  254);.    rc = D
d3a0: 6f 73 51 75 65 72 79 50 72 6f 63 41 64 64 72 28  osQueryProcAddr(
d3b0: 28 48 4d 4f 44 55 4c 45 29 70 48 61 6e 64 6c 65  (HMODULE)pHandle
d3c0: 2c 20 30 4c 2c 20 28 50 53 5a 29 5f 7a 53 79 6d  , 0L, (PSZ)_zSym
d3d0: 62 6f 6c 2c 20 26 70 66 6e 29 3b 0a 20 20 7d 0a  bol, &pfn);.  }.
d3e0: 20 20 72 65 74 75 72 6e 20 72 63 20 21 3d 20 4e    return rc != N
d3f0: 4f 5f 45 52 52 4f 52 20 3f 20 30 20 3a 20 28 76  O_ERROR ? 0 : (v
d400: 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 70 66 6e  oid(*)(void))pfn
d410: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
d420: 6f 73 32 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  os2DlClose(sqlit
d430: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
d440: 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20  id *pHandle){.  
d450: 44 6f 73 46 72 65 65 4d 6f 64 75 6c 65 28 28 48  DosFreeModule((H
d460: 4d 4f 44 55 4c 45 29 70 48 61 6e 64 6c 65 29 3b  MODULE)pHandle);
d470: 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
d480: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
d490: 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
d4a0: 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
d4b0: 6e 65 20 6f 73 32 44 6c 4f 70 65 6e 20 30 0a 20  ne os2DlOpen 0. 
d4c0: 20 23 64 65 66 69 6e 65 20 6f 73 32 44 6c 45 72   #define os2DlEr
d4d0: 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20  ror 0.  #define 
d4e0: 6f 73 32 44 6c 53 79 6d 20 30 0a 20 20 23 64 65  os2DlSym 0.  #de
d4f0: 66 69 6e 65 20 6f 73 32 44 6c 43 6c 6f 73 65 20  fine os2DlClose 
d500: 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
d510: 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75   Write up to nBu
d520: 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
d530: 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e  mness into zBuf.
d540: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
d550: 73 32 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  s2Randomness(sql
d560: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
d570: 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
d580: 7a 42 75 66 20 29 7b 0a 20 20 69 6e 74 20 6e 20  zBuf ){.  int n 
d590: 3d 20 30 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  = 0;.#if defined
d5a0: 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20  (SQLITE_TEST).  
d5b0: 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73  n = nBuf;.  mems
d5c0: 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66  et(zBuf, 0, nBuf
d5d0: 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 69  );.#else.  int i
d5e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 50              .  P
d600: 50 49 42 20 70 70 69 62 3b 0a 20 20 50 54 49 42  PIB ppib;.  PTIB
d610: 20 70 74 69 62 3b 0a 20 20 44 41 54 45 54 49 4d   ptib;.  DATETIM
d620: 45 20 64 74 3b 20 0a 20 20 73 74 61 74 69 63 20  E dt; .  static 
d630: 75 6e 73 69 67 6e 65 64 20 63 20 3d 20 30 3b 0a  unsigned c = 0;.
d640: 20 20 2f 2a 20 4f 72 64 65 72 65 64 20 62 79 20    /* Ordered by 
d650: 76 61 72 69 61 74 69 6f 6e 20 70 72 6f 62 61 62  variation probab
d660: 69 6c 69 74 79 20 2a 2f 0a 20 20 73 74 61 74 69  ility */.  stati
d670: 63 20 55 4c 4f 4e 47 20 73 76 49 64 78 5b 36 5d  c ULONG svIdx[6]
d680: 20 3d 20 7b 20 51 53 56 5f 4d 53 5f 43 4f 55 4e   = { QSV_MS_COUN
d690: 54 2c 20 51 53 56 5f 54 49 4d 45 5f 4c 4f 57 2c  T, QSV_TIME_LOW,
d6a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 51 53 56               QSV
d6c0: 5f 4d 41 58 50 52 4d 45 4d 2c 20 51 53 56 5f 4d  _MAXPRMEM, QSV_M
d6d0: 41 58 53 48 4d 45 4d 2c 0a 20 20 20 20 20 20 20  AXSHMEM,.       
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6f0: 20 20 20 20 20 51 53 56 5f 54 4f 54 41 56 41 49       QSV_TOTAVAI
d700: 4c 4d 45 4d 2c 20 51 53 56 5f 54 4f 54 52 45 53  LMEM, QSV_TOTRES
d710: 4d 45 4d 20 7d 3b 0a 0a 20 20 2f 2a 20 38 20 62  MEM };..  /* 8 b
d720: 79 74 65 73 3b 20 74 69 6d 65 7a 6f 6e 65 20 61  ytes; timezone a
d730: 6e 64 20 77 65 65 6b 64 61 79 20 64 6f 6e 27 74  nd weekday don't
d740: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 72 61   increase the ra
d750: 6e 64 6f 6d 6e 65 73 73 20 6d 75 63 68 20 2a 2f  ndomness much */
d760: 0a 20 20 69 66 28 20 28 69 6e 74 29 73 69 7a 65  .  if( (int)size
d770: 6f 66 28 64 74 29 2d 33 20 3c 3d 20 6e 42 75 66  of(dt)-3 <= nBuf
d780: 20 2d 20 6e 20 29 7b 0a 20 20 20 20 63 20 2b 3d   - n ){.    c +=
d790: 20 30 78 30 31 30 30 3b 0a 20 20 20 20 44 6f 73   0x0100;.    Dos
d7a0: 47 65 74 44 61 74 65 54 69 6d 65 28 26 64 74 29  GetDateTime(&dt)
d7b0: 3b 0a 20 20 20 20 64 74 2e 79 65 61 72 20 3d 20  ;.    dt.year = 
d7c0: 28 55 53 48 4f 52 54 29 28 28 64 74 2e 79 65 61  (USHORT)((dt.yea
d7d0: 72 20 2d 20 31 39 30 30 29 20 7c 20 63 29 3b 0a  r - 1900) | c);.
d7e0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
d7f0: 5b 6e 5d 2c 20 26 64 74 2c 20 73 69 7a 65 6f 66  [n], &dt, sizeof
d800: 28 64 74 29 2d 33 29 3b 0a 20 20 20 20 6e 20 2b  (dt)-3);.    n +
d810: 3d 20 73 69 7a 65 6f 66 28 64 74 29 2d 33 3b 0a  = sizeof(dt)-3;.
d820: 20 20 7d 0a 0a 20 20 2f 2a 20 34 20 62 79 74 65    }..  /* 4 byte
d830: 73 3b 20 50 49 44 73 20 61 6e 64 20 54 49 44 73  s; PIDs and TIDs
d840: 20 61 72 65 20 31 36 20 62 69 74 20 69 6e 74 65   are 16 bit inte
d850: 72 6e 61 6c 6c 79 2c 20 73 6f 20 63 6f 6d 62 69  rnally, so combi
d860: 6e 65 20 74 68 65 6d 20 2a 2f 0a 20 20 69 66 28  ne them */.  if(
d870: 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 55 4c 4f   (int)sizeof(ULO
d880: 4e 47 29 20 3c 3d 20 6e 42 75 66 20 2d 20 6e 20  NG) <= nBuf - n 
d890: 29 7b 0a 20 20 20 20 44 6f 73 47 65 74 49 6e 66  ){.    DosGetInf
d8a0: 6f 42 6c 6f 63 6b 73 28 26 70 74 69 62 2c 20 26  oBlocks(&ptib, &
d8b0: 70 70 69 62 29 3b 0a 20 20 20 20 2a 28 50 55 4c  ppib);.    *(PUL
d8c0: 4f 4e 47 29 26 7a 42 75 66 5b 6e 5d 20 3d 20 4d  ONG)&zBuf[n] = M
d8d0: 41 4b 45 4c 4f 4e 47 28 70 70 69 62 2d 3e 70 69  AKELONG(ppib->pi
d8e0: 62 5f 75 6c 70 69 64 2c 0a 20 20 20 20 20 20 20  b_ulpid,.       
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d900: 20 20 20 20 20 20 20 20 20 20 70 74 69 62 2d 3e            ptib->
d910: 74 69 62 5f 70 74 69 62 32 2d 3e 74 69 62 32 5f  tib_ptib2->tib2_
d920: 75 6c 74 69 64 29 3b 0a 20 20 20 20 6e 20 2b 3d  ultid);.    n +=
d930: 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47 29 3b 0a   sizeof(ULONG);.
d940: 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 20 74 6f 20    }..  /* Up to 
d950: 36 20 2a 20 34 20 62 79 74 65 73 3b 20 76 61 72  6 * 4 bytes; var
d960: 69 61 62 6c 65 73 20 64 65 70 65 6e 64 20 6f 6e  iables depend on
d970: 20 74 68 65 20 73 79 73 74 65 6d 20 73 74 61 74   the system stat
d980: 65 20 2a 2f 0a 20 20 66 6f 72 28 20 69 20 3d 20  e */.  for( i = 
d990: 30 3b 20 69 20 3c 20 36 20 26 26 20 28 69 6e 74  0; i < 6 && (int
d9a0: 29 73 69 7a 65 6f 66 28 55 4c 4f 4e 47 29 20 3c  )sizeof(ULONG) <
d9b0: 3d 20 6e 42 75 66 20 2d 20 6e 3b 20 69 2b 2b 20  = nBuf - n; i++ 
d9c0: 29 7b 0a 20 20 20 20 44 6f 73 51 75 65 72 79 53  ){.    DosQueryS
d9d0: 79 73 49 6e 66 6f 28 73 76 49 64 78 5b 69 5d 2c  ysInfo(svIdx[i],
d9e0: 20 73 76 49 64 78 5b 69 5d 2c 20 0a 20 20 20 20   svIdx[i], .    
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 28 50 55 4c 4f 4e 47 29 26 7a 42 75 66 5b 6e 5d  (PULONG)&zBuf[n]
da10: 2c 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47 29 29  , sizeof(ULONG))
da20: 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
da30: 66 28 55 4c 4f 4e 47 29 3b 0a 20 20 7d 20 0a 23  f(ULONG);.  } .#
da40: 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
da50: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  n;.}../*.** Slee
da60: 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
da70: 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
da80: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
da90: 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61   slept..** The a
daa0: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
dab0: 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
dac0: 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f  conds we want to
dad0: 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72   sleep..** The r
dae0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
daf0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
db00: 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65  roseconds of sle
db10: 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72  ep actually.** r
db20: 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
db30: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65  e underlying ope
db40: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61  rating system, a
db50: 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a   number which.**
db60: 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74 65   might be greate
db70: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
db80: 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c  to the argument,
db90: 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a   but not less.**
dba0: 20 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65   than the argume
dbb0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
dbc0: 74 20 6f 73 32 53 6c 65 65 70 28 20 73 71 6c 69  t os2Sleep( sqli
dbd0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
dbe0: 6e 74 20 6d 69 63 72 6f 73 65 63 20 29 7b 0a 20  nt microsec ){. 
dbf0: 20 44 6f 73 53 6c 65 65 70 28 20 28 6d 69 63 72   DosSleep( (micr
dc00: 6f 73 65 63 2f 31 30 30 30 29 20 29 3b 0a 20 20  osec/1000) );.  
dc10: 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 3b  return microsec;
dc20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
dc30: 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
dc40: 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
dc50: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62 65  n-zero value, be
dc60: 63 6f 6d 65 73 20 74 68 65 20 72 65 73 75 6c 74  comes the result
dc70: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 66 72 6f  .** returned fro
dc80: 6d 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  m sqlite3OsCurre
dc90: 6e 74 54 69 6d 65 28 29 2e 20 20 54 68 69 73 20  ntTime().  This 
dca0: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
dcb0: 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
dcc0: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
dcd0: 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
dce0: 69 6d 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ime = 0;.#endif.
dcf0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
dd00: 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
dd10: 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
dd20: 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
dd30: 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
dd40: 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
dd50: 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
dd60: 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
dd70: 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
dd80: 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
dd90: 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
dda0: 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
ddb0: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
ddc0: 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
ddd0: 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
dde0: 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
ddf0: 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
de00: 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
de10: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
de20: 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
de30: 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
de40: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
de50: 73 73 2c 20 72 65 74 75 72 6e 20 30 2e 20 20 52  ss, return 0.  R
de60: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
de70: 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
de80: 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
de90: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 32 43  .static int os2C
dea0: 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
deb0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
dec0: 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  s, sqlite3_int64
ded0: 20 2a 70 69 4e 6f 77 29 7b 0a 23 69 66 64 65 66   *piNow){.#ifdef
dee0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
def0: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
df00: 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70  te3_int64 unixEp
df10: 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28  och = 24405875*(
df20: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36  sqlite3_int64)86
df30: 34 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20  40000;.#endif.  
df40: 69 6e 74 20 79 65 61 72 2c 20 6d 6f 6e 74 68 2c  int year, month,
df50: 20 64 61 74 65 70 61 72 74 2c 20 74 69 6d 65 70   datepart, timep
df60: 61 72 74 3b 0a 20 0a 20 20 44 41 54 45 54 49 4d  art;. .  DATETIM
df70: 45 20 64 74 3b 0a 20 20 44 6f 73 47 65 74 44 61  E dt;.  DosGetDa
df80: 74 65 54 69 6d 65 28 20 26 64 74 20 29 3b 0a 0a  teTime( &dt );..
df90: 20 20 79 65 61 72 20 3d 20 64 74 2e 79 65 61 72    year = dt.year
dfa0: 3b 0a 20 20 6d 6f 6e 74 68 20 3d 20 64 74 2e 6d  ;.  month = dt.m
dfb0: 6f 6e 74 68 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63  onth;..  /* Calc
dfc0: 75 6c 61 74 69 6f 6e 73 20 66 72 6f 6d 20 68 74  ulations from ht
dfd0: 74 70 3a 2f 2f 77 77 77 2e 61 73 74 72 6f 2e 6b  tp://www.astro.k
dfe0: 65 65 6c 65 2e 61 63 2e 75 6b 2f 7e 72 6e 6f 2f  eele.ac.uk/~rno/
dff0: 41 73 74 72 6f 6e 6f 6d 79 2f 68 6a 64 2e 68 74  Astronomy/hjd.ht
e000: 6d 6c 0a 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 77  ml.  ** http://w
e010: 77 77 2e 61 73 74 72 6f 2e 6b 65 65 6c 65 2e 61  ww.astro.keele.a
e020: 63 2e 75 6b 2f 7e 72 6e 6f 2f 41 73 74 72 6f 6e  c.uk/~rno/Astron
e030: 6f 6d 79 2f 68 6a 64 2d 30 2e 31 2e 63 0a 20 20  omy/hjd-0.1.c.  
e040: 2a 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  ** Calculate the
e050: 20 4a 75 6c 69 61 6e 20 64 61 79 73 0a 20 20 2a   Julian days.  *
e060: 2f 0a 20 20 64 61 74 65 70 61 72 74 20 3d 20 28  /.  datepart = (
e070: 69 6e 74 29 64 74 2e 64 61 79 20 2d 20 33 32 30  int)dt.day - 320
e080: 37 36 20 2b 0a 20 20 20 20 31 34 36 31 2a 28 79  76 +.    1461*(y
e090: 65 61 72 20 2b 20 34 38 30 30 20 2b 20 28 6d 6f  ear + 4800 + (mo
e0a0: 6e 74 68 20 2d 20 31 34 29 2f 31 32 29 2f 34 20  nth - 14)/12)/4 
e0b0: 2b 0a 20 20 20 20 33 36 37 2a 28 6d 6f 6e 74 68  +.    367*(month
e0c0: 20 2d 20 32 20 2d 20 28 6d 6f 6e 74 68 20 2d 20   - 2 - (month - 
e0d0: 31 34 29 2f 31 32 2a 31 32 29 2f 31 32 20 2d 0a  14)/12*12)/12 -.
e0e0: 20 20 20 20 33 2a 28 28 79 65 61 72 20 2b 20 34      3*((year + 4
e0f0: 39 30 30 20 2b 20 28 6d 6f 6e 74 68 20 2d 20 31  900 + (month - 1
e100: 34 29 2f 31 32 29 2f 31 30 30 29 2f 34 3b 0a 0a  4)/12)/100)/4;..
e110: 20 20 2f 2a 20 54 69 6d 65 20 69 6e 20 6d 69 6c    /* Time in mil
e120: 6c 69 73 65 63 6f 6e 64 73 2c 20 68 6f 75 72 73  liseconds, hours
e130: 20 74 6f 20 6e 6f 6f 6e 20 61 64 64 65 64 20 2a   to noon added *
e140: 2f 0a 20 20 74 69 6d 65 70 61 72 74 20 3d 20 31  /.  timepart = 1
e150: 32 2a 33 36 30 30 2a 31 30 30 30 20 2b 20 64 74  2*3600*1000 + dt
e160: 2e 68 75 6e 64 72 65 64 74 68 73 2a 31 30 20 2b  .hundredths*10 +
e170: 20 64 74 2e 73 65 63 6f 6e 64 73 2a 31 30 30 30   dt.seconds*1000
e180: 20 2b 0a 20 20 20 20 28 28 69 6e 74 29 64 74 2e   +.    ((int)dt.
e190: 6d 69 6e 75 74 65 73 20 2b 20 64 74 2e 74 69 6d  minutes + dt.tim
e1a0: 65 7a 6f 6e 65 29 2a 36 30 2a 31 30 30 30 20 2b  ezone)*60*1000 +
e1b0: 20 64 74 2e 68 6f 75 72 73 2a 33 36 30 30 2a 31   dt.hours*3600*1
e1c0: 30 30 30 3b 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d  000;..  *piNow =
e1d0: 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
e1e0: 64 61 74 65 70 61 72 74 2a 38 36 34 30 30 2a 31  datepart*86400*1
e1f0: 30 30 30 20 2b 20 74 69 6d 65 70 61 72 74 3b 0a  000 + timepart;.
e200: 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54     .#ifdef SQLIT
e210: 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
e220: 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
e230: 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  e ){.    *piNow 
e240: 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  = 1000*(sqlite3_
e250: 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75  int64)sqlite3_cu
e260: 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69  rrent_time + uni
e270: 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64  xEpoch;.  }.#end
e280: 69 66 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  if..  UNUSED_PAR
e290: 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
e2a0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
e2b0: 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
e2c0: 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
e2d0: 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
e2e0: 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
e2f0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
e300: 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
e310: 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
e320: 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
e330: 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30   and.** return 0
e340: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
e350: 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
e360: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
e370: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e380: 6f 73 32 43 75 72 72 65 6e 74 54 69 6d 65 28 20  os2CurrentTime( 
e390: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
e3a0: 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77  s, double *prNow
e3b0: 20 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   ){.  int rc;.  
e3c0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b  sqlite3_int64 i;
e3d0: 0a 20 20 72 63 20 3d 20 6f 73 32 43 75 72 72 65  .  rc = os2Curre
e3e0: 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73  ntTimeInt64(pVfs
e3f0: 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63  , &i);.  if( !rc
e400: 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d   ){.    *prNow =
e410: 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
e420: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
e430: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65  }../*.** The ide
e440: 61 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  a is that this f
e450: 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69  unction works li
e460: 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ke a combination
e470: 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72   of.** GetLastEr
e480: 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74  ror() and Format
e490: 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 77 69 6e  Message() on win
e4a0: 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61  dows (or errno a
e4b0: 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  nd.** strerror_r
e4c0: 28 29 20 6f 6e 20 75 6e 69 78 29 2e 20 41 66 74  () on unix). Aft
e4d0: 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  er an error is r
e4e0: 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53  eturned by an OS
e4f0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51  .** function, SQ
e500: 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
e510: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42  function with zB
e520: 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a  uf pointing to.*
e530: 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42  * a buffer of nB
e540: 75 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53  uf bytes. The OS
e550: 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f   layer should po
e560: 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75  pulate the.** bu
e570: 66 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d  ffer with a nul-
e580: 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38  terminated UTF-8
e590: 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d   encoded error m
e5a0: 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69  essage.** descri
e5b0: 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f  bing the last IO
e5c0: 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f   error to have o
e5d0: 63 63 75 72 72 65 64 20 77 69 74 68 69 6e 20 74  ccurred within t
e5e0: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  he calling.** th
e5f0: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  read..**.** If t
e600: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
e610: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f   is too large fo
e620: 72 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62  r the supplied b
e630: 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f  uffer,.** it sho
e640: 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
e650: 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  . The return val
e660: 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72  ue of xGetLastEr
e670: 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69  ror.** is zero i
e680: 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
e690: 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20  age fits in the 
e6a0: 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a  buffer, or non-z
e6b0: 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
e6c0: 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65   (if the message
e6d0: 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e   was truncated).
e6e0: 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20   If non-zero is 
e6f0: 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65  returned,.** the
e700: 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  n it is not nece
e710: 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65  ssary to include
e720: 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   the nul-termina
e730: 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  tor character.**
e740: 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62   in the output b
e750: 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  uffer..**.** Not
e760: 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72   supplying an er
e770: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c  ror message will
e780: 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65   have no adverse
e790: 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51   effect.** on SQ
e7a0: 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65  Lite. It is fine
e7b0: 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c   to have an impl
e7c0: 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20  ementation that 
e7d0: 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73  never.** returns
e7e0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
e7f0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78  e:.**.**   int x
e800: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
e810: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
e820: 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
e830: 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73  zBuf){.**     as
e840: 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c  sert(zBuf[0]=='\
e850: 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75  0');.**     retu
e860: 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  rn 0;.**   }.**.
e870: 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e  ** However if an
e880: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
e890: 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77  s supplied, it w
e8a0: 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61  ill be incorpora
e8b0: 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65  ted.** by sqlite
e8c0: 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20   into the error 
e8d0: 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c  message availabl
e8e0: 65 20 74 6f 20 74 68 65 20 75 73 65 72 20 75 73  e to the user us
e8f0: 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65  ing.** sqlite3_e
e900: 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c  rrmsg(), possibl
e910: 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f  y making IO erro
e920: 72 73 20 65 61 73 69 65 72 20 74 6f 20 64 65 62  rs easier to deb
e930: 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ug..*/.static in
e940: 74 20 6f 73 32 47 65 74 4c 61 73 74 45 72 72 6f  t os2GetLastErro
e950: 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
e960: 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
e970: 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 61 73  har *zBuf){.  as
e980: 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c  sert(zBuf[0]=='\
e990: 30 27 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  0');.  return 0;
e9a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
e9b0: 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69  lize and deiniti
e9c0: 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74  alize the operat
e9d0: 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
e9e0: 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  face..*/.int sql
e9f0: 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69  ite3_os_init(voi
ea00: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c  d){.  static sql
ea10: 69 74 65 33 5f 76 66 73 20 6f 73 32 56 66 73 20  ite3_vfs os2Vfs 
ea20: 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20  = {.    3,      
ea30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
ea40: 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69  ersion */.    si
ea50: 7a 65 6f 66 28 6f 73 32 46 69 6c 65 29 2c 20 20  zeof(os2File),  
ea60: 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
ea70: 20 20 20 20 43 43 48 4d 41 58 50 41 54 48 2c 20      CCHMAXPATH, 
ea80: 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68         /* mxPath
ea90: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  name */.    0,  
eaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eab0: 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22  * pNext */.    "
eac0: 6f 73 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  os2",           
ead0: 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20    /* zName */.  
eae0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
eaf0: 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
eb00: 20 2a 2f 0a 0a 20 20 20 20 6f 73 32 4f 70 65 6e   */..    os2Open
eb10: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
eb20: 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 6f 73 32 44  Open */.    os2D
eb30: 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 2f  elete,         /
eb40: 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20  * xDelete */.   
eb50: 20 6f 73 32 41 63 63 65 73 73 2c 20 20 20 20 20   os2Access,     
eb60: 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
eb70: 2f 0a 20 20 20 20 6f 73 32 46 75 6c 6c 50 61 74  /.    os2FullPat
eb80: 68 6e 61 6d 65 2c 20 20 20 2f 2a 20 78 46 75 6c  hname,   /* xFul
eb90: 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  lPathname */.   
eba0: 20 6f 73 32 44 6c 4f 70 65 6e 2c 20 20 20 20 20   os2DlOpen,     
ebb0: 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
ebc0: 2f 0a 20 20 20 20 6f 73 32 44 6c 45 72 72 6f 72  /.    os2DlError
ebd0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45  ,        /* xDlE
ebe0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 6f 73 32 44  rror */.    os2D
ebf0: 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 2f  lSym,          /
ec00: 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20  * xDlSym */.    
ec10: 6f 73 32 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  os2DlClose,     
ec20: 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a     /* xDlClose *
ec30: 2f 0a 20 20 20 20 6f 73 32 52 61 6e 64 6f 6d 6e  /.    os2Randomn
ec40: 65 73 73 2c 20 20 20 20 20 2f 2a 20 78 52 61 6e  ess,     /* xRan
ec50: 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 6f  domness */.    o
ec60: 73 32 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  s2Sleep,        
ec70: 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20    /* xSleep */. 
ec80: 20 20 20 6f 73 32 43 75 72 72 65 6e 74 54 69 6d     os2CurrentTim
ec90: 65 2c 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e  e,    /* xCurren
eca0: 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 6f 73 32  tTime */.    os2
ecb0: 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
ecc0: 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
ecd0: 20 2a 2f 0a 20 20 20 20 6f 73 32 43 75 72 72 65   */.    os2Curre
ece0: 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20  ntTimeInt64, /* 
ecf0: 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
ed00: 34 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  4 */.    0,     
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
ed20: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  SetSystemCall */
ed30: 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
ed40: 20 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74 53          /* xGetS
ed50: 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
ed60: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
ed70: 20 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74      /* xNextSyst
ed80: 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 20  emCall */.  };. 
ed90: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
eda0: 69 73 74 65 72 28 26 6f 73 32 56 66 73 2c 20 31  ister(&os2Vfs, 1
edb0: 29 3b 0a 20 20 69 6e 69 74 55 63 6f 6e 76 4f 62  );.  initUconvOb
edc0: 6a 65 63 74 73 28 29 3b 0a 2f 2a 20 20 73 71 6c  jects();./*  sql
edd0: 69 74 65 33 4f 53 54 72 61 63 65 20 3d 20 31 3b  ite3OSTrace = 1;
ede0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   */.  return SQL
edf0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
ee00: 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69  lite3_os_end(voi
ee10: 64 29 7b 0a 20 20 66 72 65 65 55 63 6f 6e 76 4f  d){.  freeUconvO
ee20: 62 6a 65 63 74 73 28 29 3b 0a 20 20 72 65 74 75  bjects();.  retu
ee30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ee40: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ee50: 45 5f 4f 53 5f 4f 53 32 20 2a 2f 0a              E_OS_OS2 */.