/ Hex Artifact Content
Login

Artifact 1578149e21c4eac42c7f230a6f40500846f8e781:


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 2a  ific to OS/2..**
01b0: 0a 2a 2a 20 24 49 64 3a 20 6f 73 5f 6f 73 32 2e  .** $Id: os_os2.
01c0: 63 2c 76 20 31 2e 34 30 20 32 30 30 38 2f 30 35  c,v 1.40 2008/05
01d0: 2f 32 30 20 31 39 3a 30 38 3a 35 34 20 70 77 65  /20 19:08:54 pwe
01e0: 69 6c 62 61 63 68 65 72 20 45 78 70 20 24 0a 2a  ilbacher Exp $.*
01f0: 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  /..#include "sql
0200: 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 20 4f  iteInt.h"..#if O
0210: 53 5f 4f 53 32 0a 0a 2f 2a 0a 2a 2a 20 41 20 4e  S_OS2../*.** A N
0220: 6f 74 65 20 41 62 6f 75 74 20 4d 65 6d 6f 72 79  ote About Memory
0230: 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 0a 2a 2a 0a   Allocation:.**.
0240: 2a 2a 20 54 68 69 73 20 64 72 69 76 65 72 20 75  ** This driver u
0250: 73 65 73 20 6d 61 6c 6c 6f 63 28 29 2f 66 72 65  ses malloc()/fre
0260: 65 28 29 20 64 69 72 65 63 74 6c 79 20 72 61 74  e() directly rat
0270: 68 65 72 20 74 68 61 6e 20 67 6f 69 6e 67 20 74  her than going t
0280: 68 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20 53 51  hrough.** the SQ
0290: 4c 69 74 65 2d 77 72 61 70 70 65 72 73 20 73 71  Lite-wrappers sq
02a0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2f 73  lite3_malloc()/s
02b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 20 20  qlite3_free().  
02c0: 54 68 6f 73 65 20 77 72 61 70 70 65 72 73 0a 2a  Those wrappers.*
02d0: 2a 20 61 72 65 20 64 65 73 69 67 6e 65 64 20 66  * are designed f
02e0: 6f 72 20 75 73 65 20 6f 6e 20 65 6d 62 65 64 64  or use on embedd
02f0: 65 64 20 73 79 73 74 65 6d 73 20 77 68 65 72 65  ed systems where
0300: 20 6d 65 6d 6f 72 79 20 69 73 20 73 63 61 72 63   memory is scarc
0310: 65 20 61 6e 64 0a 2a 2a 20 6d 61 6c 6c 6f 63 20  e and.** malloc 
0320: 66 61 69 6c 75 72 65 73 20 68 61 70 70 65 6e 20  failures happen 
0330: 66 72 65 71 75 65 6e 74 6c 79 2e 20 20 4f 53 2f  frequently.  OS/
0340: 32 20 64 6f 65 73 20 6e 6f 74 20 74 79 70 69 63  2 does not typic
0350: 61 6c 6c 79 20 72 75 6e 20 6f 6e 0a 2a 2a 20 65  ally run on.** e
0360: 6d 62 65 64 64 65 64 20 73 79 73 74 65 6d 73 2c  mbedded systems,
0370: 20 61 6e 64 20 77 68 65 6e 20 69 74 20 64 6f 65   and when it doe
0380: 73 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  s the developers
0390: 20 6e 6f 72 6d 61 6c 6c 79 20 68 61 76 65 20 62   normally have b
03a0: 69 67 67 65 72 0a 2a 2a 20 70 72 6f 62 6c 65 6d  igger.** problem
03b0: 73 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74  s to worry about
03c0: 20 74 68 61 6e 20 72 75 6e 6e 69 6e 67 20 6f 75   than running ou
03d0: 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 20 53 6f  t of memory.  So
03e0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 0a 2a 2a   there is not.**
03f0: 20 61 20 63 6f 6d 70 65 6c 6c 69 6e 67 20 6e 65   a compelling ne
0400: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 77 72  ed to use the wr
0410: 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 42 75  appers..**.** Bu
0420: 74 20 74 68 65 72 65 20 69 73 20 61 20 67 6f 6f  t there is a goo
0430: 64 20 72 65 61 73 6f 6e 20 74 6f 20 6e 6f 74 20  d reason to not 
0440: 75 73 65 20 74 68 65 20 77 72 61 70 70 65 72 73  use the wrappers
0450: 2e 20 20 49 66 20 77 65 20 75 73 65 20 74 68 65  .  If we use the
0460: 0a 2a 2a 20 77 72 61 70 70 65 72 73 20 74 68 65  .** wrappers the
0470: 6e 20 77 65 20 77 69 6c 6c 20 67 65 74 20 73 69  n we will get si
0480: 6d 75 6c 61 74 65 64 20 6d 61 6c 6c 6f 63 28 29  mulated malloc()
0490: 20 66 61 69 6c 75 72 65 73 20 77 69 74 68 69 6e   failures within
04a0: 20 74 68 69 73 0a 2a 2a 20 64 72 69 76 65 72 2e   this.** driver.
04b0: 20 20 41 6e 64 20 74 68 61 74 20 63 61 75 73 65    And that cause
04c0: 73 20 61 6c 6c 20 6b 69 6e 64 73 20 6f 66 20 70  s all kinds of p
04d0: 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 75 72 20  roblems for our 
04e0: 74 65 73 74 73 2e 20 20 57 65 0a 2a 2a 20 63 6f  tests.  We.** co
04f0: 75 6c 64 20 65 6e 68 61 6e 63 65 20 53 51 4c 69  uld enhance SQLi
0500: 74 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  te to deal with 
0510: 73 69 6d 75 6c 61 74 65 64 20 6d 61 6c 6c 6f 63  simulated malloc
0520: 20 66 61 69 6c 75 72 65 73 20 77 69 74 68 69 6e   failures within
0530: 0a 2a 2a 20 74 68 65 20 4f 53 20 64 72 69 76 65  .** the OS drive
0540: 72 2c 20 62 75 74 20 74 68 65 20 63 6f 64 65 20  r, but the code 
0550: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 6f  to deal with tho
0560: 73 65 20 66 61 69 6c 75 72 65 20 77 6f 75 6c 64  se failure would
0570: 20 6e 6f 74 0a 2a 2a 20 62 65 20 65 78 65 72 63   not.** be exerc
0580: 69 73 65 64 20 6f 6e 20 4c 69 6e 75 78 20 28 77  ised on Linux (w
0590: 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 6e 65  hich does not ne
05a0: 65 64 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 69  ed to malloc() i
05b0: 6e 20 74 68 65 20 64 72 69 76 65 72 29 0a 2a 2a  n the driver).**
05c0: 20 61 6e 64 20 73 6f 20 77 65 20 77 6f 75 6c 64   and so we would
05d0: 20 68 61 76 65 20 64 69 66 66 69 63 75 6c 74 79   have difficulty
05e0: 20 77 72 69 74 69 6e 67 20 63 6f 76 65 72 61 67   writing coverag
05f0: 65 20 74 65 73 74 73 20 66 6f 72 20 74 68 61 74  e tests for that
0600: 0a 2a 2a 20 63 6f 64 65 2e 20 20 42 65 74 74 65  .** code.  Bette
0610: 72 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20 63  r to leave the c
0620: 6f 64 65 20 6f 75 74 2c 20 77 65 20 74 68 69 6e  ode out, we thin
0630: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  k..**.** The poi
0640: 6e 74 20 6f 66 20 74 68 69 73 20 64 69 73 63 75  nt of this discu
0650: 73 73 69 6f 6e 20 69 73 20 61 73 20 66 6f 6c 6c  ssion is as foll
0660: 6f 77 73 3a 20 20 57 68 65 6e 20 63 72 65 61 74  ows:  When creat
0670: 69 6e 67 20 61 20 6e 65 77 0a 2a 2a 20 4f 53 20  ing a new.** OS 
0680: 6c 61 79 65 72 20 66 6f 72 20 61 6e 20 65 6d 62  layer for an emb
0690: 65 64 64 65 64 20 73 79 73 74 65 6d 2c 20 69 66  edded system, if
06a0: 20 79 6f 75 20 75 73 65 20 74 68 69 73 20 66 69   you use this fi
06b0: 6c 65 20 61 73 20 61 6e 20 65 78 61 6d 70 6c 65  le as an example
06c0: 2c 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 75  ,.** avoid the u
06d0: 73 65 20 6f 66 20 6d 61 6c 6c 6f 63 28 29 2f 66  se of malloc()/f
06e0: 72 65 65 28 29 2e 20 20 54 68 6f 73 65 20 72 6f  ree().  Those ro
06f0: 75 74 69 6e 65 73 20 77 6f 72 6b 20 6f 6b 20 6f  utines work ok o
0700: 6e 20 4f 53 2f 32 0a 2a 2a 20 64 65 73 6b 74 6f  n OS/2.** deskto
0710: 70 73 20 62 75 74 20 6e 6f 74 20 73 6f 20 77 65  ps but not so we
0720: 6c 6c 20 69 6e 20 65 6d 62 65 64 64 65 64 20 73  ll in embedded s
0730: 79 73 74 65 6d 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  ystems..*/../*.*
0740: 2a 20 4d 61 63 72 6f 73 20 75 73 65 64 20 74 6f  * Macros used to
0750: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
0760: 65 72 20 6f 72 20 6e 6f 74 20 74 6f 20 75 73 65  er or not to use
0770: 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 23 69 66   threads..*/.#if
0780: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
0790: 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53  THREADSAFE) && S
07a0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
07b0: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
07c0: 5f 4f 53 32 5f 54 48 52 45 41 44 53 20 31 0a 23  _OS2_THREADS 1.#
07d0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
07e0: 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20 69  lude code that i
07f0: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  s common to all 
0800: 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a  os_*.c files.*/.
0810: 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d  #include "os_com
0820: 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68  mon.h"../*.** Th
0830: 65 20 6f 73 32 46 69 6c 65 20 73 74 72 75 63 74  e os2File struct
0840: 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73 20  ure is subclass 
0850: 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  of sqlite3_file 
0860: 73 70 65 63 69 66 69 63 20 66 6f 72 20 74 68 65  specific for the
0870: 20 4f 53 2f 32 0a 2a 2a 20 70 72 6f 74 61 62 69   OS/2.** protabi
0880: 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a 74  lity layer..*/.t
0890: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 6f 73  ypedef struct os
08a0: 32 46 69 6c 65 20 6f 73 32 46 69 6c 65 3b 0a 73  2File os2File;.s
08b0: 74 72 75 63 74 20 6f 73 32 46 69 6c 65 20 7b 0a  truct os2File {.
08c0: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
08d0: 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74  io_methods *pMet
08e0: 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20  hod;  /* Always 
08f0: 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
0900: 2a 2f 0a 20 20 48 46 49 4c 45 20 68 3b 20 20 20  */.  HFILE h;   
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0920: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63  * Handle for acc
0930: 65 73 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20  essing the file 
0940: 2a 2f 0a 20 20 63 68 61 72 2a 20 70 61 74 68 54  */.  char* pathT
0950: 6f 44 65 6c 3b 20 20 20 20 20 20 20 20 20 20 2f  oDel;          /
0960: 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
0970: 6f 20 64 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73  o delete on clos
0980: 65 2c 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 2a  e, NULL if not *
0990: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
09a0: 72 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 2f 2a  r locktype;   /*
09b0: 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75   Type of lock cu
09c0: 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20  rrently held on 
09d0: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a  this file */.};.
09e0: 0a 23 64 65 66 69 6e 65 20 4c 4f 43 4b 5f 54 49  .#define LOCK_TI
09f0: 4d 45 4f 55 54 20 31 30 4c 20 2f 2a 20 74 68 65  MEOUT 10L /* the
0a00: 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
0a10: 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 0a 2f 2a 2a   timeout */../**
0a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
0a70: 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66  he next group of
0a80: 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d   routines implem
0a90: 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68  ent the I/O meth
0aa0: 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ods specified.**
0ab0: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
0ac0: 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
0ad0: 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t..*************
0ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b20: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  */../*.** Close 
0b30: 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 6f  a file..*/.int o
0b40: 73 32 43 6c 6f 73 65 28 20 73 71 6c 69 74 65 33  s2Close( sqlite3
0b50: 5f 66 69 6c 65 20 2a 69 64 20 29 7b 0a 20 20 41  _file *id ){.  A
0b60: 50 49 52 45 54 20 72 63 20 3d 20 4e 4f 5f 45 52  PIRET rc = NO_ER
0b70: 52 4f 52 3b 0a 20 20 6f 73 32 46 69 6c 65 20 2a  ROR;.  os2File *
0b80: 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 69 64 20  pFile;.  if( id 
0b90: 26 26 20 28 70 46 69 6c 65 20 3d 20 28 6f 73 32  && (pFile = (os2
0ba0: 46 69 6c 65 2a 29 69 64 29 20 21 3d 20 30 20 29  File*)id) != 0 )
0bb0: 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 32 28 20  {.    OSTRACE2( 
0bc0: 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 70 46  "CLOSE %d\n", pF
0bd0: 69 6c 65 2d 3e 68 20 29 3b 0a 20 20 20 20 72 63  ile->h );.    rc
0be0: 20 3d 20 44 6f 73 43 6c 6f 73 65 28 20 70 46 69   = DosClose( pFi
0bf0: 6c 65 2d 3e 68 20 29 3b 0a 20 20 20 20 70 46 69  le->h );.    pFi
0c00: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e  le->locktype = N
0c10: 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 69 66 28 20  O_LOCK;.    if( 
0c20: 70 46 69 6c 65 2d 3e 70 61 74 68 54 6f 44 65 6c  pFile->pathToDel
0c30: 20 21 3d 20 4e 55 4c 4c 20 29 7b 0a 20 20 20 20   != NULL ){.    
0c40: 20 20 72 63 20 3d 20 44 6f 73 46 6f 72 63 65 44    rc = DosForceD
0c50: 65 6c 65 74 65 28 20 28 50 53 5a 29 70 46 69 6c  elete( (PSZ)pFil
0c60: 65 2d 3e 70 61 74 68 54 6f 44 65 6c 20 29 3b 0a  e->pathToDel );.
0c70: 20 20 20 20 20 20 66 72 65 65 28 20 70 46 69 6c        free( pFil
0c80: 65 2d 3e 70 61 74 68 54 6f 44 65 6c 20 29 3b 0a  e->pathToDel );.
0c90: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 61 74        pFile->pat
0ca0: 68 54 6f 44 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 20  hToDel = NULL;. 
0cb0: 20 20 20 7d 0a 20 20 20 20 69 64 20 3d 20 30 3b     }.    id = 0;
0cc0: 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  .    OpenCounter
0cd0: 28 20 2d 31 20 29 3b 0a 20 20 7d 0a 0a 20 20 72  ( -1 );.  }..  r
0ce0: 65 74 75 72 6e 20 72 63 20 3d 3d 20 4e 4f 5f 45  eturn rc == NO_E
0cf0: 52 52 4f 52 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  RROR ? SQLITE_OK
0d00: 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   : SQLITE_IOERR;
0d10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
0d20: 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
0d30: 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
0d40: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
0d50: 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73   if all.** bytes
0d60: 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65   were read succe
0d70: 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49  ssfully and SQLI
0d80: 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74  TE_IOERR if anyt
0d90: 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
0da0: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 6f 73 32 52 65  ng..*/.int os2Re
0db0: 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
0dc0: 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
0dd0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f        /* File to
0de0: 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
0df0: 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e10: 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74  /* Write content
0e20: 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
0e30: 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20  r */.  int amt, 
0e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0e60: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61   of bytes to rea
0e70: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  d */.  sqlite3_i
0e80: 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20  nt64 offset     
0e90: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
0ea0: 72 65 61 64 69 6e 67 20 61 74 20 74 68 69 73 20  reading at this 
0eb0: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 55  offset */.){.  U
0ec0: 4c 4f 4e 47 20 66 69 6c 65 4c 6f 63 61 74 69 6f  LONG fileLocatio
0ed0: 6e 20 3d 20 30 4c 3b 0a 20 20 55 4c 4f 4e 47 20  n = 0L;.  ULONG 
0ee0: 67 6f 74 3b 0a 20 20 6f 73 32 46 69 6c 65 20 2a  got;.  os2File *
0ef0: 70 46 69 6c 65 20 3d 20 28 6f 73 32 46 69 6c 65  pFile = (os2File
0f00: 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20  *)id;.  assert( 
0f10: 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c  id!=0 );.  Simul
0f20: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
0f30: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
0f40: 52 45 41 44 20 29 3b 0a 20 20 4f 53 54 52 41 43  READ );.  OSTRAC
0f50: 45 33 28 20 22 52 45 41 44 20 25 64 20 6c 6f 63  E3( "READ %d loc
0f60: 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
0f70: 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
0f80: 70 65 20 29 3b 0a 20 20 69 66 28 20 44 6f 73 53  pe );.  if( DosS
0f90: 65 74 46 69 6c 65 50 74 72 28 70 46 69 6c 65 2d  etFilePtr(pFile-
0fa0: 3e 68 2c 20 6f 66 66 73 65 74 2c 20 46 49 4c 45  >h, offset, FILE
0fb0: 5f 42 45 47 49 4e 2c 20 26 66 69 6c 65 4c 6f 63  _BEGIN, &fileLoc
0fc0: 61 74 69 6f 6e 29 20 21 3d 20 4e 4f 5f 45 52 52  ation) != NO_ERR
0fd0: 4f 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OR ){.    return
0fe0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
0ff0: 20 7d 0a 20 20 69 66 28 20 44 6f 73 52 65 61 64   }.  if( DosRead
1000: 28 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66  ( pFile->h, pBuf
1010: 2c 20 61 6d 74 2c 20 26 67 6f 74 20 29 20 21 3d  , amt, &got ) !=
1020: 20 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20   NO_ERROR ){.   
1030: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1040: 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 0a 20  OERR_READ;.  }. 
1050: 20 69 66 28 20 67 6f 74 20 3d 3d 20 28 55 4c 4f   if( got == (ULO
1060: 4e 47 29 61 6d 74 20 29 0a 20 20 20 20 72 65 74  NG)amt ).    ret
1070: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1080: 20 65 6c 73 65 20 7b 0a 20 20 20 20 6d 65 6d 73   else {.    mems
1090: 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66  et(&((char*)pBuf
10a0: 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67  )[got], 0, amt-g
10b0: 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ot);.    return 
10c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
10d0: 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a  RT_READ;.  }.}..
10e0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
10f0: 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69   from a buffer i
1100: 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74  nto a file.  Ret
1110: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
1120: 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73   success.** or s
1130: 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
1140: 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e  code on failure.
1150: 0a 2a 2f 0a 69 6e 74 20 6f 73 32 57 72 69 74 65  .*/.int os2Write
1160: 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1170: 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20   *id,           
1180: 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77      /* File to w
1190: 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63  rite into */.  c
11a0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11c0: 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f 20 62  * The bytes to b
11d0: 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  e written */.  i
11e0: 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1200: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1210: 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  s to write */.  
1220: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
1230: 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  fset            
1240: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74  /* Offset into t
1250: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69 6e  he file to begin
1260: 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29   writing at */.)
1270: 7b 0a 20 20 55 4c 4f 4e 47 20 66 69 6c 65 4c 6f  {.  ULONG fileLo
1280: 63 61 74 69 6f 6e 20 3d 20 30 4c 3b 0a 20 20 41  cation = 0L;.  A
1290: 50 49 52 45 54 20 72 63 20 3d 20 4e 4f 5f 45 52  PIRET rc = NO_ER
12a0: 52 4f 52 3b 0a 20 20 55 4c 4f 4e 47 20 77 72 6f  ROR;.  ULONG wro
12b0: 74 65 3b 0a 20 20 6f 73 32 46 69 6c 65 20 2a 70  te;.  os2File *p
12c0: 46 69 6c 65 20 3d 20 28 6f 73 32 46 69 6c 65 2a  File = (os2File*
12d0: 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69  )id;.  assert( i
12e0: 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61  d!=0 );.  Simula
12f0: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
1300: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1310: 52 49 54 45 20 29 3b 0a 20 20 53 69 6d 75 6c 61  RITE );.  Simula
1320: 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
1330: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1340: 55 4c 4c 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ULL );.  OSTRACE
1350: 33 28 20 22 57 52 49 54 45 20 25 64 20 6c 6f 63  3( "WRITE %d loc
1360: 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
1370: 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
1380: 70 65 20 29 3b 0a 20 20 69 66 28 20 44 6f 73 53  pe );.  if( DosS
1390: 65 74 46 69 6c 65 50 74 72 28 70 46 69 6c 65 2d  etFilePtr(pFile-
13a0: 3e 68 2c 20 6f 66 66 73 65 74 2c 20 46 49 4c 45  >h, offset, FILE
13b0: 5f 42 45 47 49 4e 2c 20 26 66 69 6c 65 4c 6f 63  _BEGIN, &fileLoc
13c0: 61 74 69 6f 6e 29 20 21 3d 20 4e 4f 5f 45 52 52  ation) != NO_ERR
13d0: 4f 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OR ){.    return
13e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
13f0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74   }.  assert( amt
1400: 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 61  >0 );.  while( a
1410: 6d 74 20 3e 20 30 20 26 26 0a 20 20 20 20 20 20  mt > 0 &&.      
1420: 20 20 20 28 20 72 63 20 3d 20 44 6f 73 57 72 69     ( rc = DosWri
1430: 74 65 28 20 70 46 69 6c 65 2d 3e 68 2c 20 28 50  te( pFile->h, (P
1440: 56 4f 49 44 29 70 42 75 66 2c 20 61 6d 74 2c 20  VOID)pBuf, amt, 
1450: 26 77 72 6f 74 65 20 29 20 29 20 3d 3d 20 4e 4f  &wrote ) ) == NO
1460: 5f 45 52 52 4f 52 20 26 26 0a 20 20 20 20 20 20  _ERROR &&.      
1470: 20 20 20 77 72 6f 74 65 20 3e 20 30 0a 20 20 29     wrote > 0.  )
1480: 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f  {.    amt -= wro
1490: 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
14a0: 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
14b0: 6f 74 65 5d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ote];.  }..  ret
14c0: 75 72 6e 20 28 20 72 63 20 21 3d 20 4e 4f 5f 45  urn ( rc != NO_E
14d0: 52 52 4f 52 20 7c 7c 20 61 6d 74 20 3e 20 28 69  RROR || amt > (i
14e0: 6e 74 29 77 72 6f 74 65 20 29 20 3f 20 53 51 4c  nt)wrote ) ? SQL
14f0: 49 54 45 5f 46 55 4c 4c 20 3a 20 53 51 4c 49 54  ITE_FULL : SQLIT
1500: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1510: 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20  runcate an open 
1520: 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66  file to a specif
1530: 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  ied size.*/.int 
1540: 6f 73 32 54 72 75 6e 63 61 74 65 28 20 73 71 6c  os2Truncate( sql
1550: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1560: 36 34 20 6e 42 79 74 65 20 29 7b 0a 20 20 41 50  64 nByte ){.  AP
1570: 49 52 45 54 20 72 63 20 3d 20 4e 4f 5f 45 52 52  IRET rc = NO_ERR
1580: 4f 52 3b 0a 20 20 6f 73 32 46 69 6c 65 20 2a 70  OR;.  os2File *p
1590: 46 69 6c 65 20 3d 20 28 6f 73 32 46 69 6c 65 2a  File = (os2File*
15a0: 29 69 64 3b 0a 20 20 4f 53 54 52 41 43 45 33 28  )id;.  OSTRACE3(
15b0: 20 22 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c   "TRUNCATE %d %l
15c0: 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  ld\n", pFile->h,
15d0: 20 6e 42 79 74 65 20 29 3b 0a 20 20 53 69 6d 75   nByte );.  Simu
15e0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
15f0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1600: 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 20 20 72  _TRUNCATE );.  r
1610: 63 20 3d 20 44 6f 73 53 65 74 46 69 6c 65 53 69  c = DosSetFileSi
1620: 7a 65 28 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42  ze( pFile->h, nB
1630: 79 74 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  yte );.  return 
1640: 72 63 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20 3f  rc == NO_ERROR ?
1650: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
1660: 49 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a 0a 23 69  ITE_IOERR;.}..#i
1670: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1680: 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
1690: 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73   number of fulls
16a0: 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20  yncs and normal 
16b0: 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20  syncs.  This is 
16c0: 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20  used to test.** 
16d0: 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66  that syncs and f
16e0: 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63  ullsyncs are occ
16f0: 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67  uring at the rig
1700: 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74  ht times..*/.int
1710: 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
1720: 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c  unt = 0;.int sql
1730: 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
1740: 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
1750: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1760: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
1770: 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
1780: 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
1790: 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 6f  o disk..*/.int o
17a0: 73 32 53 79 6e 63 28 20 73 71 6c 69 74 65 33 5f  s2Sync( sqlite3_
17b0: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
17c0: 61 67 73 20 29 7b 0a 20 20 6f 73 32 46 69 6c 65  ags ){.  os2File
17d0: 20 2a 70 46 69 6c 65 20 3d 20 28 6f 73 32 46 69   *pFile = (os2Fi
17e0: 6c 65 2a 29 69 64 3b 0a 20 20 4f 53 54 52 41 43  le*)id;.  OSTRAC
17f0: 45 33 28 20 22 53 59 4e 43 20 25 64 20 6c 6f 63  E3( "SYNC %d loc
1800: 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
1810: 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
1820: 70 65 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  pe );.#ifdef SQL
1830: 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66  ITE_TEST.  if( f
1840: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 59  lags & SQLITE_SY
1850: 4e 43 5f 46 55 4c 4c 29 7b 0a 20 20 20 20 73 71  NC_FULL){.    sq
1860: 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
1870: 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71  ount++;.  }.  sq
1880: 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
1890: 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  ++;.#endif.  ret
18a0: 75 72 6e 20 44 6f 73 52 65 73 65 74 42 75 66 66  urn DosResetBuff
18b0: 65 72 28 20 70 46 69 6c 65 2d 3e 68 20 29 20 3d  er( pFile->h ) =
18c0: 3d 20 4e 4f 5f 45 52 52 4f 52 20 3f 20 53 51 4c  = NO_ERROR ? SQL
18d0: 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f  ITE_OK : SQLITE_
18e0: 49 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  IOERR;.}../*.** 
18f0: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
1900: 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
1910: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
1920: 0a 69 6e 74 20 6f 73 32 46 69 6c 65 53 69 7a 65  .int os2FileSize
1930: 28 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ( sqlite3_file *
1940: 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
1950: 34 20 2a 70 53 69 7a 65 20 29 7b 0a 20 20 41 50  4 *pSize ){.  AP
1960: 49 52 45 54 20 72 63 20 3d 20 4e 4f 5f 45 52 52  IRET rc = NO_ERR
1970: 4f 52 3b 0a 20 20 46 49 4c 45 53 54 41 54 55 53  OR;.  FILESTATUS
1980: 33 20 66 73 74 73 33 46 69 6c 65 49 6e 66 6f 3b  3 fsts3FileInfo;
1990: 0a 20 20 6d 65 6d 73 65 74 28 26 66 73 74 73 33  .  memset(&fsts3
19a0: 46 69 6c 65 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  FileInfo, 0, siz
19b0: 65 6f 66 28 66 73 74 73 33 46 69 6c 65 49 6e 66  eof(fsts3FileInf
19c0: 6f 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  o));.  assert( i
19d0: 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61  d!=0 );.  Simula
19e0: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
19f0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  n SQLITE_IOERR )
1a00: 3b 0a 20 20 72 63 20 3d 20 44 6f 73 51 75 65 72  ;.  rc = DosQuer
1a10: 79 46 69 6c 65 49 6e 66 6f 28 20 28 28 6f 73 32  yFileInfo( ((os2
1a20: 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 46 49  File*)id)->h, FI
1a30: 4c 5f 53 54 41 4e 44 41 52 44 2c 20 26 66 73 74  L_STANDARD, &fst
1a40: 73 33 46 69 6c 65 49 6e 66 6f 2c 20 73 69 7a 65  s3FileInfo, size
1a50: 6f 66 28 46 49 4c 45 53 54 41 54 55 53 33 29 20  of(FILESTATUS3) 
1a60: 29 3b 0a 20 20 69 66 28 20 72 63 20 3d 3d 20 4e  );.  if( rc == N
1a70: 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 2a  O_ERROR ){.    *
1a80: 70 53 69 7a 65 20 3d 20 66 73 74 73 33 46 69 6c  pSize = fsts3Fil
1a90: 65 49 6e 66 6f 2e 63 62 46 69 6c 65 3b 0a 20 20  eInfo.cbFile;.  
1aa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ab0: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
1ac0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1ad0: 4f 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  OERR;.  }.}../*.
1ae0: 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 61  ** Acquire a rea
1af0: 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  der lock..*/.sta
1b00: 74 69 63 20 69 6e 74 20 67 65 74 52 65 61 64 4c  tic int getReadL
1b10: 6f 63 6b 28 20 6f 73 32 46 69 6c 65 20 2a 70 46  ock( os2File *pF
1b20: 69 6c 65 20 29 7b 0a 20 20 46 49 4c 45 4c 4f 43  ile ){.  FILELOC
1b30: 4b 20 20 4c 6f 63 6b 41 72 65 61 2c 0a 20 20 20  K  LockArea,.   
1b40: 20 20 20 20 20 20 20 20 20 55 6e 6c 6f 63 6b 41           UnlockA
1b50: 72 65 61 3b 0a 20 20 41 50 49 52 45 54 20 72 65  rea;.  APIRET re
1b60: 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26 4c 6f 63  s;.  memset(&Loc
1b70: 6b 41 72 65 61 2c 20 30 2c 20 73 69 7a 65 6f 66  kArea, 0, sizeof
1b80: 28 4c 6f 63 6b 41 72 65 61 29 29 3b 0a 20 20 6d  (LockArea));.  m
1b90: 65 6d 73 65 74 28 26 55 6e 6c 6f 63 6b 41 72 65  emset(&UnlockAre
1ba0: 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 55 6e 6c  a, 0, sizeof(Unl
1bb0: 6f 63 6b 41 72 65 61 29 29 3b 0a 20 20 4c 6f 63  ockArea));.  Loc
1bc0: 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20  kArea.lOffset = 
1bd0: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
1be0: 4c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20  LockArea.lRange 
1bf0: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
1c00: 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66   UnlockArea.lOff
1c10: 73 65 74 20 3d 20 30 4c 3b 0a 20 20 55 6e 6c 6f  set = 0L;.  Unlo
1c20: 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20  ckArea.lRange = 
1c30: 30 4c 3b 0a 20 20 72 65 73 20 3d 20 44 6f 73 53  0L;.  res = DosS
1c40: 65 74 46 69 6c 65 4c 6f 63 6b 73 28 20 70 46 69  etFileLocks( pFi
1c50: 6c 65 2d 3e 68 2c 20 26 55 6e 6c 6f 63 6b 41 72  le->h, &UnlockAr
1c60: 65 61 2c 20 26 4c 6f 63 6b 41 72 65 61 2c 20 4c  ea, &LockArea, L
1c70: 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c 20 31 4c 20  OCK_TIMEOUT, 1L 
1c80: 29 3b 0a 20 20 4f 53 54 52 41 43 45 33 28 20 22  );.  OSTRACE3( "
1c90: 47 45 54 52 45 41 44 4c 4f 43 4b 20 25 64 20 72  GETREADLOCK %d r
1ca0: 65 73 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  es=%d\n", pFile-
1cb0: 3e 68 2c 20 72 65 73 20 29 3b 0a 20 20 72 65 74  >h, res );.  ret
1cc0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
1cd0: 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63  * Undo a readloc
1ce0: 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  k.*/.static int 
1cf0: 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 20  unlockReadLock( 
1d00: 6f 73 32 46 69 6c 65 20 2a 69 64 20 29 7b 0a 20  os2File *id ){. 
1d10: 20 46 49 4c 45 4c 4f 43 4b 20 20 4c 6f 63 6b 41   FILELOCK  LockA
1d20: 72 65 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rea,.           
1d30: 20 55 6e 6c 6f 63 6b 41 72 65 61 3b 0a 20 20 41   UnlockArea;.  A
1d40: 50 49 52 45 54 20 72 65 73 3b 0a 20 20 6d 65 6d  PIRET res;.  mem
1d50: 73 65 74 28 26 4c 6f 63 6b 41 72 65 61 2c 20 30  set(&LockArea, 0
1d60: 2c 20 73 69 7a 65 6f 66 28 4c 6f 63 6b 41 72 65  , sizeof(LockAre
1d70: 61 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 55  a));.  memset(&U
1d80: 6e 6c 6f 63 6b 41 72 65 61 2c 20 30 2c 20 73 69  nlockArea, 0, si
1d90: 7a 65 6f 66 28 55 6e 6c 6f 63 6b 41 72 65 61 29  zeof(UnlockArea)
1da0: 29 3b 0a 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 4f  );.  LockArea.lO
1db0: 66 66 73 65 74 20 3d 20 30 4c 3b 0a 20 20 4c 6f  ffset = 0L;.  Lo
1dc0: 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20  ckArea.lRange = 
1dd0: 30 4c 3b 0a 20 20 55 6e 6c 6f 63 6b 41 72 65 61  0L;.  UnlockArea
1de0: 2e 6c 4f 66 66 73 65 74 20 3d 20 53 48 41 52 45  .lOffset = SHARE
1df0: 44 5f 46 49 52 53 54 3b 0a 20 20 55 6e 6c 6f 63  D_FIRST;.  Unloc
1e00: 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20 53  kArea.lRange = S
1e10: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 72 65  HARED_SIZE;.  re
1e20: 73 20 3d 20 44 6f 73 53 65 74 46 69 6c 65 4c 6f  s = DosSetFileLo
1e30: 63 6b 73 28 20 69 64 2d 3e 68 2c 20 26 55 6e 6c  cks( id->h, &Unl
1e40: 6f 63 6b 41 72 65 61 2c 20 26 4c 6f 63 6b 41 72  ockArea, &LockAr
1e50: 65 61 2c 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54  ea, LOCK_TIMEOUT
1e60: 2c 20 31 4c 20 29 3b 0a 20 20 4f 53 54 52 41 43  , 1L );.  OSTRAC
1e70: 45 33 28 20 22 55 4e 4c 4f 43 4b 2d 52 45 41 44  E3( "UNLOCK-READ
1e80: 4c 4f 43 4b 20 66 69 6c 65 20 68 61 6e 64 6c 65  LOCK file handle
1e90: 3d 25 64 20 72 65 73 3d 25 64 3f 5c 6e 22 2c 20  =%d res=%d?\n", 
1ea0: 69 64 2d 3e 68 2c 20 72 65 73 20 29 3b 0a 20 20  id->h, res );.  
1eb0: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
1ec0: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
1ed0: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
1ee0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
1ef0: 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65  rameter locktype
1f00: 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
1f10: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
1f20: 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
1f30: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
1f40: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
1f50: 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
1f60: 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
1f70: 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
1f80: 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
1f90: 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
1fa0: 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
1fb0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
1fc0: 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
1fd0: 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
1fe0: 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
1ff0: 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
2000: 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
2010: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
2020: 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
2030: 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
2040: 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
2050: 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
2060: 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
2070: 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
2080: 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
2090: 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
20a0: 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
20b0: 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
20c0: 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
20d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
20e0: 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
20f0: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
2100: 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
2110: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
2120: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
2130: 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
2140: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
2150: 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
2160: 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
2170: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2180: 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
2190: 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
21a0: 54 68 65 20 6f 73 32 55 6e 6c 6f 63 6b 28 29 20  The os2Unlock() 
21b0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65  routine.** erase
21c0: 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f  s all locks at o
21d0: 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20  nce and returns 
21e0: 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  us immediately t
21f0: 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  o locking level 
2200: 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20  0..** It is not 
2210: 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65  possible to lowe
2220: 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
2230: 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20  vel one step at 
2240: 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20  a time.  You.** 
2250: 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74  must go straight
2260: 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65   to locking leve
2270: 6c 20 30 2e 0a 2a 2f 0a 69 6e 74 20 6f 73 32 4c  l 0..*/.int os2L
2280: 6f 63 6b 28 20 73 71 6c 69 74 65 33 5f 66 69 6c  ock( sqlite3_fil
2290: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
22a0: 79 70 65 20 29 7b 0a 20 20 69 6e 74 20 72 63 20  ype ){.  int rc 
22b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
22c0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
22d0: 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e  e from subroutin
22e0: 65 73 20 2a 2f 0a 20 20 41 50 49 52 45 54 20 72  es */.  APIRET r
22f0: 65 73 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20  es = NO_ERROR;  
2300: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61    /* Result of a
2310: 6e 20 4f 53 2f 32 20 6c 6f 63 6b 20 63 61 6c 6c  n OS/2 lock call
2320: 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63   */.  int newLoc
2330: 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20  ktype;       /* 
2340: 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  Set pFile->lockt
2350: 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ype to this valu
2360: 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  e before exiting
2370: 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e   */.  int gotPen
2380: 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20  dingLock = 0;/* 
2390: 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75 69  True if we acqui
23a0: 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  red a PENDING lo
23b0: 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a  ck this time */.
23c0: 20 20 46 49 4c 45 4c 4f 43 4b 20 20 4c 6f 63 6b    FILELOCK  Lock
23d0: 41 72 65 61 2c 0a 20 20 20 20 20 20 20 20 20 20  Area,.          
23e0: 20 20 55 6e 6c 6f 63 6b 41 72 65 61 3b 0a 20 20    UnlockArea;.  
23f0: 6f 73 32 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  os2File *pFile =
2400: 20 28 6f 73 32 46 69 6c 65 2a 29 69 64 3b 0a 20   (os2File*)id;. 
2410: 20 6d 65 6d 73 65 74 28 26 4c 6f 63 6b 41 72 65   memset(&LockAre
2420: 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 63  a, 0, sizeof(Loc
2430: 6b 41 72 65 61 29 29 3b 0a 20 20 6d 65 6d 73 65  kArea));.  memse
2440: 74 28 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 30  t(&UnlockArea, 0
2450: 2c 20 73 69 7a 65 6f 66 28 55 6e 6c 6f 63 6b 41  , sizeof(UnlockA
2460: 72 65 61 29 29 3b 0a 20 20 61 73 73 65 72 74 28  rea));.  assert(
2470: 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f   pFile!=0 );.  O
2480: 53 54 52 41 43 45 34 28 20 22 4c 4f 43 4b 20 25  STRACE4( "LOCK %
2490: 64 20 25 64 20 77 61 73 20 25 64 5c 6e 22 2c 20  d %d was %d\n", 
24a0: 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
24b0: 70 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  pe, pFile->lockt
24c0: 79 70 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ype );..  /* If 
24d0: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
24e0: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
24f0: 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
2500: 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
2510: 20 20 2a 2a 20 6f 73 32 46 69 6c 65 2c 20 64 6f    ** os2File, do
2520: 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
2530: 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b  use the end_lock
2540: 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
2550: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 75 74    ** sqlite3_mut
2560: 65 78 5f 65 6e 74 65 72 28 29 20 68 61 73 6e 27  ex_enter() hasn'
2570: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
2580: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
2590: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c  ile->locktype>=l
25a0: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f  ocktype ){.    O
25b0: 53 54 52 41 43 45 33 28 20 22 4c 4f 43 4b 20 25  STRACE3( "LOCK %
25c0: 64 20 25 64 20 6f 6b 20 28 61 6c 72 65 61 64 79  d %d ok (already
25d0: 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46 69 6c 65   held)\n", pFile
25e0: 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 20 29 3b  ->h, locktype );
25f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2600: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2610: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
2620: 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
2630: 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a  is correct.  */.
2640: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
2650: 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f  >locktype!=NO_LO
2660: 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK || locktype==
2670: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
2680: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
2690: 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e!=PENDING_LOCK 
26a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
26b0: 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f  ktype!=RESERVED_
26c0: 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c  LOCK || pFile->l
26d0: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
26e0: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  LOCK );..  /* Lo
26f0: 63 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c  ck the PENDING_L
2700: 4f 43 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e  OCK byte if we n
2710: 65 65 64 20 74 6f 20 61 63 71 75 69 72 65 20 61  eed to acquire a
2720: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72   PENDING lock or
2730: 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c  .  ** a SHARED l
2740: 6f 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20  ock.  If we are 
2750: 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
2760: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71  ED lock, the acq
2770: 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a  uisition of.  **
2780: 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
2790: 4b 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72  K byte is tempor
27a0: 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c  ary..  */.  newL
27b0: 6f 63 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d  ocktype = pFile-
27c0: 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28  >locktype;.  if(
27d0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
27e0: 3d 3d 4e 4f 5f 4c 4f 43 4b 0a 20 20 20 20 20 20  ==NO_LOCK.      
27f0: 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  || (locktype==EX
2800: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
2810: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
2820: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 0a  =RESERVED_LOCK).
2830: 20 20 29 7b 0a 20 20 20 20 4c 6f 63 6b 41 72 65    ){.    LockAre
2840: 61 2e 6c 4f 66 66 73 65 74 20 3d 20 50 45 4e 44  a.lOffset = PEND
2850: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 4c 6f  ING_BYTE;.    Lo
2860: 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20  ckArea.lRange = 
2870: 31 4c 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72  1L;.    UnlockAr
2880: 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 30 4c 3b  ea.lOffset = 0L;
2890: 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e  .    UnlockArea.
28a0: 6c 52 61 6e 67 65 20 3d 20 30 4c 3b 0a 0a 20 20  lRange = 0L;..  
28b0: 20 20 2f 2a 20 77 61 69 74 20 6c 6f 6e 67 65 72    /* wait longer
28c0: 20 74 68 61 6e 20 4c 4f 43 4b 5f 54 49 4d 45 4f   than LOCK_TIMEO
28d0: 55 54 20 68 65 72 65 20 6e 6f 74 20 74 6f 20 68  UT here not to h
28e0: 61 76 65 20 74 6f 20 74 72 79 20 6d 75 6c 74 69  ave to try multi
28f0: 70 6c 65 20 74 69 6d 65 73 20 2a 2f 0a 20 20 20  ple times */.   
2900: 20 72 65 73 20 3d 20 44 6f 73 53 65 74 46 69 6c   res = DosSetFil
2910: 65 4c 6f 63 6b 73 28 20 70 46 69 6c 65 2d 3e 68  eLocks( pFile->h
2920: 2c 20 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 26  , &UnlockArea, &
2930: 4c 6f 63 6b 41 72 65 61 2c 20 31 30 30 4c 2c 20  LockArea, 100L, 
2940: 30 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65  0L );.    if( re
2950: 73 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20 29 7b  s == NO_ERROR ){
2960: 0a 20 20 20 20 20 20 67 6f 74 50 65 6e 64 69 6e  .      gotPendin
2970: 67 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  gLock = 1;.     
2980: 20 4f 53 54 52 41 43 45 33 28 20 22 4c 4f 43 4b   OSTRACE3( "LOCK
2990: 20 25 64 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b   %d pending lock
29a0: 20 62 6f 6f 6c 65 61 6e 20 73 65 74 2e 20 20 72   boolean set.  r
29b0: 65 73 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  es=%d\n", pFile-
29c0: 3e 68 2c 20 72 65 73 20 29 3b 0a 20 20 20 20 7d  >h, res );.    }
29d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
29e0: 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  re a shared lock
29f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
2a00: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
2a10: 4b 20 26 26 20 72 65 73 20 3d 3d 20 4e 4f 5f 45  K && res == NO_E
2a20: 52 52 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65  RROR ){.    asse
2a30: 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
2a40: 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a  ype==NO_LOCK );.
2a50: 20 20 20 20 72 65 73 20 3d 20 67 65 74 52 65 61      res = getRea
2a60: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
2a70: 20 20 69 66 28 20 72 65 73 20 3d 3d 20 4e 4f 5f    if( res == NO_
2a80: 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 6e  ERROR ){.      n
2a90: 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ewLocktype = SHA
2aa0: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  RED_LOCK;.    }.
2ab0: 20 20 20 20 4f 53 54 52 41 43 45 33 28 20 22 4c      OSTRACE3( "L
2ac0: 4f 43 4b 20 25 64 20 61 63 71 75 69 72 65 20 73  OCK %d acquire s
2ad0: 68 61 72 65 64 20 6c 6f 63 6b 2e 20 72 65 73 3d  hared lock. res=
2ae0: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
2af0: 20 72 65 73 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f   res );.  }..  /
2b00: 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45  * Acquire a RESE
2b10: 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  RVED lock.  */. 
2b20: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52   if( locktype==R
2b30: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
2b40: 72 65 73 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20  res == NO_ERROR 
2b50: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2b60: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
2b70: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
2b80: 20 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66     LockArea.lOff
2b90: 73 65 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  set = RESERVED_B
2ba0: 59 54 45 3b 0a 20 20 20 20 4c 6f 63 6b 41 72 65  YTE;.    LockAre
2bb0: 61 2e 6c 52 61 6e 67 65 20 3d 20 31 4c 3b 0a 20  a.lRange = 1L;. 
2bc0: 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 4f     UnlockArea.lO
2bd0: 66 66 73 65 74 20 3d 20 30 4c 3b 0a 20 20 20 20  ffset = 0L;.    
2be0: 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67  UnlockArea.lRang
2bf0: 65 20 3d 20 30 4c 3b 0a 20 20 20 20 72 65 73 20  e = 0L;.    res 
2c00: 3d 20 44 6f 73 53 65 74 46 69 6c 65 4c 6f 63 6b  = DosSetFileLock
2c10: 73 28 20 70 46 69 6c 65 2d 3e 68 2c 20 26 55 6e  s( pFile->h, &Un
2c20: 6c 6f 63 6b 41 72 65 61 2c 20 26 4c 6f 63 6b 41  lockArea, &LockA
2c30: 72 65 61 2c 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55  rea, LOCK_TIMEOU
2c40: 54 2c 20 30 4c 20 29 3b 0a 20 20 20 20 69 66 28  T, 0L );.    if(
2c50: 20 72 65 73 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52   res == NO_ERROR
2c60: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
2c70: 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44  ktype = RESERVED
2c80: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  _LOCK;.    }.   
2c90: 20 4f 53 54 52 41 43 45 33 28 20 22 4c 4f 43 4b   OSTRACE3( "LOCK
2ca0: 20 25 64 20 61 63 71 75 69 72 65 20 72 65 73 65   %d acquire rese
2cb0: 72 76 65 64 20 6c 6f 63 6b 2e 20 72 65 73 3d 25  rved lock. res=%
2cc0: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
2cd0: 72 65 73 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  res );.  }..  /*
2ce0: 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44 49   Acquire a PENDI
2cf0: 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  NG lock.  */.  i
2d00: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
2d10: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72  LUSIVE_LOCK && r
2d20: 65 73 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20 29  es == NO_ERROR )
2d30: 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70  {.    newLocktyp
2d40: 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  e = PENDING_LOCK
2d50: 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67  ;.    gotPending
2d60: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 4f 53  Lock = 0;.    OS
2d70: 54 52 41 43 45 32 28 20 22 4c 4f 43 4b 20 25 64  TRACE2( "LOCK %d
2d80: 20 61 63 71 75 69 72 65 20 70 65 6e 64 69 6e 67   acquire pending
2d90: 20 6c 6f 63 6b 2e 20 70 65 6e 64 69 6e 67 20 6c   lock. pending l
2da0: 6f 63 6b 20 62 6f 6f 6c 65 61 6e 20 75 6e 73 65  ock boolean unse
2db0: 74 2e 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 20  t.\n", pFile->h 
2dc0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71  );.  }..  /* Acq
2dd0: 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
2de0: 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  E lock.  */.  if
2df0: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
2e00: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65  USIVE_LOCK && re
2e10: 73 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20 29 7b  s == NO_ERROR ){
2e20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
2e30: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48  le->locktype>=SH
2e40: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
2e50: 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61   res = unlockRea
2e60: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
2e70: 20 20 4f 53 54 52 41 43 45 32 28 20 22 75 6e 72    OSTRACE2( "unr
2e80: 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c  eadlock = %d\n",
2e90: 20 72 65 73 20 29 3b 0a 20 20 20 20 4c 6f 63 6b   res );.    Lock
2ea0: 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 53  Area.lOffset = S
2eb0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
2ec0: 20 4c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65   LockArea.lRange
2ed0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
2ee0: 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c      UnlockArea.l
2ef0: 4f 66 66 73 65 74 20 3d 20 30 4c 3b 0a 20 20 20  Offset = 0L;.   
2f00: 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e   UnlockArea.lRan
2f10: 67 65 20 3d 20 30 4c 3b 0a 20 20 20 20 72 65 73  ge = 0L;.    res
2f20: 20 3d 20 44 6f 73 53 65 74 46 69 6c 65 4c 6f 63   = DosSetFileLoc
2f30: 6b 73 28 20 70 46 69 6c 65 2d 3e 68 2c 20 26 55  ks( pFile->h, &U
2f40: 6e 6c 6f 63 6b 41 72 65 61 2c 20 26 4c 6f 63 6b  nlockArea, &Lock
2f50: 41 72 65 61 2c 20 4c 4f 43 4b 5f 54 49 4d 45 4f  Area, LOCK_TIMEO
2f60: 55 54 2c 20 30 4c 20 29 3b 0a 20 20 20 20 69 66  UT, 0L );.    if
2f70: 28 20 72 65 73 20 3d 3d 20 4e 4f 5f 45 52 52 4f  ( res == NO_ERRO
2f80: 52 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  R ){.      newLo
2f90: 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49  cktype = EXCLUSI
2fa0: 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  VE_LOCK;.    }el
2fb0: 73 65 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  se{.      OSTRAC
2fc0: 45 32 28 20 22 4f 53 2f 32 20 65 72 72 6f 72 2d  E2( "OS/2 error-
2fd0: 63 6f 64 65 20 3d 20 25 64 5c 6e 22 2c 20 72 65  code = %d\n", re
2fe0: 73 20 29 3b 0a 20 20 20 20 20 20 67 65 74 52 65  s );.      getRe
2ff0: 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
3000: 20 20 20 7d 0a 20 20 20 20 4f 53 54 52 41 43 45     }.    OSTRACE
3010: 33 28 20 22 4c 4f 43 4b 20 25 64 20 61 63 71 75  3( "LOCK %d acqu
3020: 69 72 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  ire exclusive lo
3030: 63 6b 2e 20 20 72 65 73 3d 25 64 5c 6e 22 2c 20  ck.  res=%d\n", 
3040: 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 20 29 3b  pFile->h, res );
3050: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
3060: 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50   are holding a P
3070: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74  ENDING lock that
3080: 20 6f 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c   ought to be rel
3090: 65 61 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a  eased, then.  **
30a0: 20 72 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e   release it now.
30b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50  .  */.  if( gotP
30c0: 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f  endingLock && lo
30d0: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
30e0: 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  OCK ){.    int r
30f0: 3b 0a 20 20 20 20 4c 6f 63 6b 41 72 65 61 2e 6c  ;.    LockArea.l
3100: 4f 66 66 73 65 74 20 3d 20 30 4c 3b 0a 20 20 20  Offset = 0L;.   
3110: 20 4c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65   LockArea.lRange
3120: 20 3d 20 30 4c 3b 0a 20 20 20 20 55 6e 6c 6f 63   = 0L;.    Unloc
3130: 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20  kArea.lOffset = 
3140: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
3150: 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 52 61    UnlockArea.lRa
3160: 6e 67 65 20 3d 20 31 4c 3b 0a 20 20 20 20 72 20  nge = 1L;.    r 
3170: 3d 20 44 6f 73 53 65 74 46 69 6c 65 4c 6f 63 6b  = DosSetFileLock
3180: 73 28 20 70 46 69 6c 65 2d 3e 68 2c 20 26 55 6e  s( pFile->h, &Un
3190: 6c 6f 63 6b 41 72 65 61 2c 20 26 4c 6f 63 6b 41  lockArea, &LockA
31a0: 72 65 61 2c 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55  rea, LOCK_TIMEOU
31b0: 54 2c 20 30 4c 20 29 3b 0a 20 20 20 20 4f 53 54  T, 0L );.    OST
31c0: 52 41 43 45 33 28 20 22 4c 4f 43 4b 20 25 64 20  RACE3( "LOCK %d 
31d0: 75 6e 6c 6f 63 6b 69 6e 67 20 70 65 6e 64 69 6e  unlocking pendin
31e0: 67 2f 69 73 20 73 68 61 72 65 64 2e 20 72 3d 25  g/is shared. r=%
31f0: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
3200: 72 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  r );.  }..  /* U
3210: 70 64 61 74 65 20 74 68 65 20 73 74 61 74 65 20  pdate the state 
3220: 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  of the lock has 
3230: 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65  held in the file
3240: 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e   descriptor then
3250: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  .  ** return the
3260: 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65 73   appropriate res
3270: 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ult code..  */. 
3280: 20 69 66 28 20 72 65 73 20 3d 3d 20 4e 4f 5f 45   if( res == NO_E
3290: 52 52 4f 52 20 29 7b 0a 20 20 20 20 72 63 20 3d  RROR ){.    rc =
32a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
32b0: 6c 73 65 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  lse{.    OSTRACE
32c0: 34 28 20 22 4c 4f 43 4b 20 46 41 49 4c 45 44 20  4( "LOCK FAILED 
32d0: 25 64 20 74 72 79 69 6e 67 20 66 6f 72 20 25 64  %d trying for %d
32e0: 20 62 75 74 20 67 6f 74 20 25 64 5c 6e 22 2c 20   but got %d\n", 
32f0: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
3300: 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
3310: 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 29 3b  , newLocktype );
3320: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
3330: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69  _BUSY;.  }.  pFi
3340: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6e  le->locktype = n
3350: 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53  ewLocktype;.  OS
3360: 54 52 41 43 45 33 28 20 22 4c 4f 43 4b 20 25 64  TRACE3( "LOCK %d
3370: 20 6e 6f 77 20 25 64 5c 6e 22 2c 20 70 46 69 6c   now %d\n", pFil
3380: 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
3390: 6b 74 79 70 65 20 29 3b 0a 20 20 72 65 74 75 72  ktype );.  retur
33a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
33b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
33c0: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
33d0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
33e0: 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
33f0: 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
3400: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
3410: 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
3420: 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
3430: 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  d, return.** non
3440: 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  -zero, otherwise
3450: 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 6f 73   zero..*/.int os
3460: 32 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  2CheckReservedLo
3470: 63 6b 28 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck( sqlite3_file
3480: 20 2a 69 64 20 29 7b 0a 20 20 69 6e 74 20 72 20   *id ){.  int r 
3490: 3d 20 30 3b 0a 20 20 6f 73 32 46 69 6c 65 20 2a  = 0;.  os2File *
34a0: 70 46 69 6c 65 20 3d 20 28 6f 73 32 46 69 6c 65  pFile = (os2File
34b0: 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20  *)id;.  assert( 
34c0: 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66  pFile!=0 );.  if
34d0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
34e0: 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
34f0: 20 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a 20   ){.    r = 1;. 
3500: 20 20 20 4f 53 54 52 41 43 45 33 28 20 22 54 45     OSTRACE3( "TE
3510: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
3520: 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69   (local)\n", pFi
3530: 6c 65 2d 3e 68 2c 20 72 20 29 3b 0a 20 20 7d 65  le->h, r );.  }e
3540: 6c 73 65 7b 0a 20 20 20 20 46 49 4c 45 4c 4f 43  lse{.    FILELOC
3550: 4b 20 20 4c 6f 63 6b 41 72 65 61 2c 0a 20 20 20  K  LockArea,.   
3560: 20 20 20 20 20 20 20 20 20 20 20 55 6e 6c 6f 63             Unloc
3570: 6b 41 72 65 61 3b 0a 20 20 20 20 41 50 49 52 45  kArea;.    APIRE
3580: 54 20 72 63 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b  T rc = NO_ERROR;
3590: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 4c 6f 63  .    memset(&Loc
35a0: 6b 41 72 65 61 2c 20 30 2c 20 73 69 7a 65 6f 66  kArea, 0, sizeof
35b0: 28 4c 6f 63 6b 41 72 65 61 29 29 3b 0a 20 20 20  (LockArea));.   
35c0: 20 6d 65 6d 73 65 74 28 26 55 6e 6c 6f 63 6b 41   memset(&UnlockA
35d0: 72 65 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 55  rea, 0, sizeof(U
35e0: 6e 6c 6f 63 6b 41 72 65 61 29 29 3b 0a 20 20 20  nlockArea));.   
35f0: 20 4c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65   LockArea.lOffse
3600: 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54  t = RESERVED_BYT
3610: 45 3b 0a 20 20 20 20 4c 6f 63 6b 41 72 65 61 2e  E;.    LockArea.
3620: 6c 52 61 6e 67 65 20 3d 20 31 4c 3b 0a 20 20 20  lRange = 1L;.   
3630: 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66   UnlockArea.lOff
3640: 73 65 74 20 3d 20 30 4c 3b 0a 20 20 20 20 55 6e  set = 0L;.    Un
3650: 6c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20  lockArea.lRange 
3660: 3d 20 30 4c 3b 0a 20 20 20 20 72 63 20 3d 20 44  = 0L;.    rc = D
3670: 6f 73 53 65 74 46 69 6c 65 4c 6f 63 6b 73 28 20  osSetFileLocks( 
3680: 70 46 69 6c 65 2d 3e 68 2c 20 26 55 6e 6c 6f 63  pFile->h, &Unloc
3690: 6b 41 72 65 61 2c 20 26 4c 6f 63 6b 41 72 65 61  kArea, &LockArea
36a0: 2c 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c 20  , LOCK_TIMEOUT, 
36b0: 30 4c 20 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  0L );.    OSTRAC
36c0: 45 33 28 20 22 54 45 53 54 20 57 52 2d 4c 4f 43  E3( "TEST WR-LOC
36d0: 4b 20 25 64 20 6c 6f 63 6b 20 72 65 73 65 72 76  K %d lock reserv
36e0: 65 64 20 62 79 74 65 20 72 63 3d 25 64 5c 6e 22  ed byte rc=%d\n"
36f0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20 29  , pFile->h, rc )
3700: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 3d 3d 20  ;.    if( rc == 
3710: 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  NO_ERROR ){.    
3720: 20 20 41 50 49 52 45 54 20 72 63 75 20 3d 20 4e    APIRET rcu = N
3730: 4f 5f 45 52 52 4f 52 3b 20 2f 2a 20 72 65 74 75  O_ERROR; /* retu
3740: 72 6e 20 63 6f 64 65 20 66 6f 72 20 75 6e 6c 6f  rn code for unlo
3750: 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 4c  cking */.      L
3760: 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74 20  ockArea.lOffset 
3770: 3d 20 30 4c 3b 0a 20 20 20 20 20 20 4c 6f 63 6b  = 0L;.      Lock
3780: 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20 30 4c  Area.lRange = 0L
3790: 3b 0a 20 20 20 20 20 20 55 6e 6c 6f 63 6b 41 72  ;.      UnlockAr
37a0: 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 52 45 53  ea.lOffset = RES
37b0: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
37c0: 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 52 61    UnlockArea.lRa
37d0: 6e 67 65 20 3d 20 31 4c 3b 0a 20 20 20 20 20 20  nge = 1L;.      
37e0: 72 63 75 20 3d 20 44 6f 73 53 65 74 46 69 6c 65  rcu = DosSetFile
37f0: 4c 6f 63 6b 73 28 20 70 46 69 6c 65 2d 3e 68 2c  Locks( pFile->h,
3800: 20 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 26 4c   &UnlockArea, &L
3810: 6f 63 6b 41 72 65 61 2c 20 4c 4f 43 4b 5f 54 49  ockArea, LOCK_TI
3820: 4d 45 4f 55 54 2c 20 30 4c 20 29 3b 0a 20 20 20  MEOUT, 0L );.   
3830: 20 20 20 4f 53 54 52 41 43 45 33 28 20 22 54 45     OSTRACE3( "TE
3840: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 75 6e  ST WR-LOCK %d un
3850: 6c 6f 63 6b 20 72 65 73 65 72 76 65 64 20 62 79  lock reserved by
3860: 74 65 20 72 3d 25 64 5c 6e 22 2c 20 70 46 69 6c  te r=%d\n", pFil
3870: 65 2d 3e 68 2c 20 72 63 75 20 29 3b 0a 20 20 20  e->h, rcu );.   
3880: 20 7d 0a 20 20 20 20 72 20 3d 20 21 28 72 63 20   }.    r = !(rc 
3890: 3d 3d 20 4e 4f 5f 45 52 52 4f 52 29 3b 0a 20 20  == NO_ERROR);.  
38a0: 20 20 4f 53 54 52 41 43 45 33 28 20 22 54 45 53    OSTRACE3( "TES
38b0: 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
38c0: 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69  (remote)\n", pFi
38d0: 6c 65 2d 3e 68 2c 20 72 20 29 3b 0a 20 20 7d 0a  le->h, r );.  }.
38e0: 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f    return r;.}../
38f0: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
3900: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
3910: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
3920: 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  id to locktype. 
3930: 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
3940: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
3950: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
3960: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
3970: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
3980: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
3990: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
39a0: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
39b0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
39c0: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
39d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
39e0: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  o-op..**.** It i
39f0: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
3a00: 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
3a10: 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65 20 73  to fail if the s
3a20: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
3a30: 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49  * is NO_LOCK.  I
3a40: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
3a50: 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45 44 5f  ument is SHARED_
3a60: 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73 20 72  LOCK then this r
3a70: 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20  outine.** might 
3a80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
3a90: 45 52 52 3b 0a 2a 2f 0a 69 6e 74 20 6f 73 32 55  ERR;.*/.int os2U
3aa0: 6e 6c 6f 63 6b 28 20 73 71 6c 69 74 65 33 5f 66  nlock( sqlite3_f
3ab0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
3ac0: 6b 74 79 70 65 20 29 7b 0a 20 20 69 6e 74 20 74  ktype ){.  int t
3ad0: 79 70 65 3b 0a 20 20 6f 73 32 46 69 6c 65 20 2a  ype;.  os2File *
3ae0: 70 46 69 6c 65 20 3d 20 28 6f 73 32 46 69 6c 65  pFile = (os2File
3af0: 2a 29 69 64 3b 0a 20 20 41 50 49 52 45 54 20 72  *)id;.  APIRET r
3b00: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
3b10: 20 41 50 49 52 45 54 20 72 65 73 20 3d 20 4e 4f   APIRET res = NO
3b20: 5f 45 52 52 4f 52 3b 0a 20 20 46 49 4c 45 4c 4f  _ERROR;.  FILELO
3b30: 43 4b 20 20 4c 6f 63 6b 41 72 65 61 2c 0a 20 20  CK  LockArea,.  
3b40: 20 20 20 20 20 20 20 20 20 20 55 6e 6c 6f 63 6b            Unlock
3b50: 41 72 65 61 3b 0a 20 20 6d 65 6d 73 65 74 28 26  Area;.  memset(&
3b60: 4c 6f 63 6b 41 72 65 61 2c 20 30 2c 20 73 69 7a  LockArea, 0, siz
3b70: 65 6f 66 28 4c 6f 63 6b 41 72 65 61 29 29 3b 0a  eof(LockArea));.
3b80: 20 20 6d 65 6d 73 65 74 28 26 55 6e 6c 6f 63 6b    memset(&Unlock
3b90: 41 72 65 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Area, 0, sizeof(
3ba0: 55 6e 6c 6f 63 6b 41 72 65 61 29 29 3b 0a 20 20  UnlockArea));.  
3bb0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
3bc0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
3bd0: 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
3be0: 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  OCK );.  OSTRACE
3bf0: 34 28 20 22 55 4e 4c 4f 43 4b 20 25 64 20 74 6f  4( "UNLOCK %d to
3c00: 20 25 64 20 77 61 73 20 25 64 5c 6e 22 2c 20 70   %d was %d\n", p
3c10: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
3c20: 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  e, pFile->lockty
3c30: 70 65 20 29 3b 0a 20 20 74 79 70 65 20 3d 20 70  pe );.  type = p
3c40: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
3c50: 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c    if( type>=EXCL
3c60: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
3c70: 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73    LockArea.lOffs
3c80: 65 74 20 3d 20 30 4c 3b 0a 20 20 20 20 4c 6f 63  et = 0L;.    Loc
3c90: 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20 30  kArea.lRange = 0
3ca0: 4c 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65  L;.    UnlockAre
3cb0: 61 2e 6c 4f 66 66 73 65 74 20 3d 20 53 48 41 52  a.lOffset = SHAR
3cc0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 55 6e  ED_FIRST;.    Un
3cd0: 6c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20  lockArea.lRange 
3ce0: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
3cf0: 20 20 20 72 65 73 20 3d 20 44 6f 73 53 65 74 46     res = DosSetF
3d00: 69 6c 65 4c 6f 63 6b 73 28 20 70 46 69 6c 65 2d  ileLocks( pFile-
3d10: 3e 68 2c 20 26 55 6e 6c 6f 63 6b 41 72 65 61 2c  >h, &UnlockArea,
3d20: 20 26 4c 6f 63 6b 41 72 65 61 2c 20 4c 4f 43 4b   &LockArea, LOCK
3d30: 5f 54 49 4d 45 4f 55 54 2c 20 30 4c 20 29 3b 0a  _TIMEOUT, 0L );.
3d40: 20 20 20 20 4f 53 54 52 41 43 45 33 28 20 22 55      OSTRACE3( "U
3d50: 4e 4c 4f 43 4b 20 25 64 20 65 78 63 6c 75 73 69  NLOCK %d exclusi
3d60: 76 65 20 6c 6f 63 6b 20 72 65 73 3d 25 64 5c 6e  ve lock res=%d\n
3d70: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73  ", pFile->h, res
3d80: 20 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   );.    if( lock
3d90: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
3da0: 4b 20 26 26 20 67 65 74 52 65 61 64 4c 6f 63 6b  K && getReadLock
3db0: 28 70 46 69 6c 65 29 20 21 3d 20 4e 4f 5f 45 52  (pFile) != NO_ER
3dc0: 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ROR ){.      /* 
3dd0: 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  This should neve
3de0: 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68  r happen.  We sh
3df0: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61  ould always be a
3e00: 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
3e10: 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
3e20: 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ad lock */.     
3e30: 20 4f 53 54 52 41 43 45 33 28 20 22 55 4e 4c 4f   OSTRACE3( "UNLO
3e40: 43 4b 20 25 64 20 74 6f 20 25 64 20 67 65 74 52  CK %d to %d getR
3e50: 65 61 64 4c 6f 63 6b 28 29 20 66 61 69 6c 65 64  eadLock() failed
3e60: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c  \n", pFile->h, l
3e70: 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 20  ocktype );.     
3e80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
3e90: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d  RR_UNLOCK;.    }
3ea0: 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e  .  }.  if( type>
3eb0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
3ec0: 7b 0a 20 20 20 20 4c 6f 63 6b 41 72 65 61 2e 6c  {.    LockArea.l
3ed0: 4f 66 66 73 65 74 20 3d 20 30 4c 3b 0a 20 20 20  Offset = 0L;.   
3ee0: 20 4c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65   LockArea.lRange
3ef0: 20 3d 20 30 4c 3b 0a 20 20 20 20 55 6e 6c 6f 63   = 0L;.    Unloc
3f00: 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20  kArea.lOffset = 
3f10: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
3f20: 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 52     UnlockArea.lR
3f30: 61 6e 67 65 20 3d 20 31 4c 3b 0a 20 20 20 20 72  ange = 1L;.    r
3f40: 65 73 20 3d 20 44 6f 73 53 65 74 46 69 6c 65 4c  es = DosSetFileL
3f50: 6f 63 6b 73 28 20 70 46 69 6c 65 2d 3e 68 2c 20  ocks( pFile->h, 
3f60: 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 26 4c 6f  &UnlockArea, &Lo
3f70: 63 6b 41 72 65 61 2c 20 4c 4f 43 4b 5f 54 49 4d  ckArea, LOCK_TIM
3f80: 45 4f 55 54 2c 20 30 4c 20 29 3b 0a 20 20 20 20  EOUT, 0L );.    
3f90: 4f 53 54 52 41 43 45 33 28 20 22 55 4e 4c 4f 43  OSTRACE3( "UNLOC
3fa0: 4b 20 25 64 20 72 65 73 65 72 76 65 64 20 72 65  K %d reserved re
3fb0: 73 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  s=%d\n", pFile->
3fc0: 68 2c 20 72 65 73 20 29 3b 0a 20 20 7d 0a 20 20  h, res );.  }.  
3fd0: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
3fe0: 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53  _LOCK && type>=S
3ff0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
4000: 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65    res = unlockRe
4010: 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
4020: 20 20 20 4f 53 54 52 41 43 45 35 28 20 22 55 4e     OSTRACE5( "UN
4030: 4c 4f 43 4b 20 25 64 20 69 73 20 25 64 20 77 61  LOCK %d is %d wa
4040: 6e 74 20 25 64 20 72 65 73 3d 25 64 5c 6e 22 2c  nt %d res=%d\n",
4050: 20 70 46 69 6c 65 2d 3e 68 2c 20 74 79 70 65 2c   pFile->h, type,
4060: 20 6c 6f 63 6b 74 79 70 65 2c 20 72 65 73 20 29   locktype, res )
4070: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65  ;.  }.  if( type
4080: 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  >=PENDING_LOCK )
4090: 7b 0a 20 20 20 20 4c 6f 63 6b 41 72 65 61 2e 6c  {.    LockArea.l
40a0: 4f 66 66 73 65 74 20 3d 20 30 4c 3b 0a 20 20 20  Offset = 0L;.   
40b0: 20 4c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65   LockArea.lRange
40c0: 20 3d 20 30 4c 3b 0a 20 20 20 20 55 6e 6c 6f 63   = 0L;.    Unloc
40d0: 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20  kArea.lOffset = 
40e0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
40f0: 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 52 61    UnlockArea.lRa
4100: 6e 67 65 20 3d 20 31 4c 3b 0a 20 20 20 20 72 65  nge = 1L;.    re
4110: 73 20 3d 20 44 6f 73 53 65 74 46 69 6c 65 4c 6f  s = DosSetFileLo
4120: 63 6b 73 28 20 70 46 69 6c 65 2d 3e 68 2c 20 26  cks( pFile->h, &
4130: 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 26 4c 6f 63  UnlockArea, &Loc
4140: 6b 41 72 65 61 2c 20 4c 4f 43 4b 5f 54 49 4d 45  kArea, LOCK_TIME
4150: 4f 55 54 2c 20 30 4c 20 29 3b 0a 20 20 20 20 4f  OUT, 0L );.    O
4160: 53 54 52 41 43 45 33 28 20 22 55 4e 4c 4f 43 4b  STRACE3( "UNLOCK
4170: 20 25 64 20 70 65 6e 64 69 6e 67 20 72 65 73 3d   %d pending res=
4180: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
4190: 20 72 65 73 20 29 3b 0a 20 20 7d 0a 20 20 70 46   res );.  }.  pF
41a0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
41b0: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52  locktype;.  OSTR
41c0: 41 43 45 33 28 20 22 55 4e 4c 4f 43 4b 20 25 64  ACE3( "UNLOCK %d
41d0: 20 6e 6f 77 20 25 64 5c 6e 22 2c 20 70 46 69 6c   now %d\n", pFil
41e0: 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
41f0: 6b 74 79 70 65 20 29 3b 0a 20 20 72 65 74 75 72  ktype );.  retur
4200: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
4210: 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79  ontrol and query
4220: 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
4230: 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
4240: 74 69 63 20 69 6e 74 20 6f 73 32 46 69 6c 65 43  tic int os2FileC
4250: 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
4260: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c  ile *id, int op,
4270: 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
4280: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
4290: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
42a0: 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b  NTL_LOCKSTATE: {
42b0: 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
42c0: 72 67 20 3d 20 28 28 6f 73 32 46 69 6c 65 2a 29  rg = ((os2File*)
42d0: 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  id)->locktype;. 
42e0: 20 20 20 20 20 4f 53 54 52 41 43 45 33 28 20 22       OSTRACE3( "
42f0: 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 20  FCNTL_LOCKSTATE 
4300: 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 28  %d lock=%d\n", (
4310: 28 6f 73 32 46 69 6c 65 2a 29 69 64 29 2d 3e 68  (os2File*)id)->h
4320: 2c 20 28 28 6f 73 32 46 69 6c 65 2a 29 69 64 29  , ((os2File*)id)
4330: 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20  ->locktype );.  
4340: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4350: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
4360: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4370: 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
4380: 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f  Return the secto
4390: 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  r size in bytes 
43a0: 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
43b0: 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66  g block device f
43c0: 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66  or.** the specif
43d0: 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69  ied file. This i
43e0: 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  s almost always 
43f0: 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d  512 bytes, but m
4400: 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20  ay be.** larger 
4410: 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73  for some devices
4420: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ..**.** SQLite c
4430: 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73  ode assumes this
4440: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
4450: 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61   fail. It also a
4460: 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69  ssumes that.** i
4470: 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20  f two files are 
4480: 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73  created in the s
4490: 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ame file-system 
44a0: 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a  directory (i.e..
44b0: 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e  ** a database an
44c0: 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  d its journal fi
44d0: 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63  le) that the sec
44e0: 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
44f0: 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72   the.** same for
4500: 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   both..*/.static
4510: 20 69 6e 74 20 6f 73 32 53 65 63 74 6f 72 53 69   int os2SectorSi
4520: 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
4530: 2a 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53  *id){.  return S
4540: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
4550: 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  CTOR_SIZE;.}../*
4560: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63  .** Return a vec
4570: 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63 68  tor of device ch
4580: 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a  aracteristics..*
4590: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 32  /.static int os2
45a0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
45b0: 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
45c0: 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72  le *id){.  retur
45d0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65  n 0;.}../*.** He
45e0: 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 74 6f  lper function to
45f0: 20 63 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 66   convert UTF-8 f
4600: 69 6c 65 6e 61 6d 65 73 20 74 6f 20 6c 6f 63 61  ilenames to loca
4610: 6c 20 4f 53 2f 32 20 63 6f 64 65 70 61 67 65 2e  l OS/2 codepage.
4620: 0a 2a 2a 20 54 68 65 20 74 77 6f 2d 73 74 65 70  .** The two-step
4630: 20 70 72 6f 63 65 73 73 3a 20 66 69 72 73 74 20   process: first 
4640: 63 6f 6e 76 65 72 74 20 74 68 65 20 69 6e 63 6f  convert the inco
4650: 6d 69 6e 67 20 55 54 46 2d 38 20 73 74 72 69 6e  ming UTF-8 strin
4660: 67 0a 2a 2a 20 69 6e 74 6f 20 55 43 53 2d 32 20  g.** into UCS-2 
4670: 61 6e 64 20 74 68 65 6e 20 66 72 6f 6d 20 55 43  and then from UC
4680: 53 2d 32 20 74 6f 20 74 68 65 20 63 75 72 72 65  S-2 to the curre
4690: 6e 74 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 20  nt codepage..** 
46a0: 54 68 65 20 72 65 74 75 72 6e 65 64 20 63 68 61  The returned cha
46b0: 72 20 70 6f 69 6e 74 65 72 20 68 61 73 20 74 6f  r pointer has to
46c0: 20 62 65 20 66 72 65 65 64 2e 0a 2a 2f 0a 63 68   be freed..*/.ch
46d0: 61 72 20 2a 63 6f 6e 76 65 72 74 55 74 66 38 50  ar *convertUtf8P
46e0: 61 74 68 54 6f 43 70 28 63 6f 6e 73 74 20 63 68  athToCp(const ch
46f0: 61 72 20 2a 69 6e 29 0a 7b 0a 20 20 55 63 6f 6e  ar *in).{.  Ucon
4700: 76 4f 62 6a 65 63 74 20 75 63 6f 6e 76 3b 0a 20  vObject uconv;. 
4710: 20 55 6e 69 43 68 61 72 20 75 63 73 55 74 66 38   UniChar ucsUtf8
4720: 43 70 5b 31 32 5d 2c 0a 20 20 20 20 20 20 20 20  Cp[12],.        
4730: 20 20 74 65 6d 70 50 61 74 68 5b 43 43 48 4d 41    tempPath[CCHMA
4740: 58 50 41 54 48 5d 3b 0a 20 20 63 68 61 72 20 2a  XPATH];.  char *
4750: 6f 75 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  out;.  int rc = 
4760: 30 3b 0a 0a 20 20 6f 75 74 20 3d 20 28 63 68 61  0;..  out = (cha
4770: 72 20 2a 29 63 61 6c 6c 6f 63 28 43 43 48 4d 41  r *)calloc(CCHMA
4780: 58 50 41 54 48 2c 20 31 29 3b 0a 0a 20 20 2f 2a  XPATH, 1);..  /*
4790: 20 64 65 74 65 72 6d 69 6e 65 20 73 74 72 69 6e   determine strin
47a0: 67 20 66 6f 72 20 74 68 65 20 63 6f 6e 76 65 72  g for the conver
47b0: 73 69 6f 6e 20 6f 66 20 55 54 46 2d 38 20 77 68  sion of UTF-8 wh
47c0: 69 63 68 20 69 73 20 43 50 31 32 30 38 20 2a 2f  ich is CP1208 */
47d0: 0a 20 20 72 63 20 3d 20 55 6e 69 4d 61 70 43 70  .  rc = UniMapCp
47e0: 54 6f 55 63 73 43 70 28 31 32 30 38 2c 20 75 63  ToUcsCp(1208, uc
47f0: 73 55 74 66 38 43 70 2c 20 31 32 29 3b 0a 20 20  sUtf8Cp, 12);.  
4800: 72 63 20 3d 20 55 6e 69 43 72 65 61 74 65 55 63  rc = UniCreateUc
4810: 6f 6e 76 4f 62 6a 65 63 74 28 75 63 73 55 74 66  onvObject(ucsUtf
4820: 38 43 70 2c 20 26 75 63 6f 6e 76 29 3b 0a 20 20  8Cp, &uconv);.  
4830: 72 63 20 3d 20 55 6e 69 53 74 72 54 6f 55 63 73  rc = UniStrToUcs
4840: 28 75 63 6f 6e 76 2c 20 74 65 6d 70 50 61 74 68  (uconv, tempPath
4850: 2c 20 28 63 68 61 72 20 2a 29 69 6e 2c 20 43 43  , (char *)in, CC
4860: 48 4d 41 58 50 41 54 48 29 3b 0a 20 20 72 63 20  HMAXPATH);.  rc 
4870: 3d 20 55 6e 69 46 72 65 65 55 63 6f 6e 76 4f 62  = UniFreeUconvOb
4880: 6a 65 63 74 28 75 63 6f 6e 76 29 3b 0a 0a 20 20  ject(uconv);..  
4890: 2f 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 20 66 6f  /* conversion fo
48a0: 72 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61  r current codepa
48b0: 67 65 20 77 68 69 63 68 20 63 61 6e 20 62 65 20  ge which can be 
48c0: 75 73 65 64 20 66 6f 72 20 70 61 74 68 73 20 2a  used for paths *
48d0: 2f 0a 20 20 72 63 20 3d 20 55 6e 69 43 72 65 61  /.  rc = UniCrea
48e0: 74 65 55 63 6f 6e 76 4f 62 6a 65 63 74 28 28 55  teUconvObject((U
48f0: 6e 69 43 68 61 72 20 2a 29 4c 22 40 70 61 74 68  niChar *)L"@path
4900: 3d 79 65 73 22 2c 20 26 75 63 6f 6e 76 29 3b 0a  =yes", &uconv);.
4910: 20 20 72 63 20 3d 20 55 6e 69 53 74 72 46 72 6f    rc = UniStrFro
4920: 6d 55 63 73 28 75 63 6f 6e 76 2c 20 6f 75 74 2c  mUcs(uconv, out,
4930: 20 74 65 6d 70 50 61 74 68 2c 20 43 43 48 4d 41   tempPath, CCHMA
4940: 58 50 41 54 48 29 3b 0a 20 20 72 63 20 3d 20 55  XPATH);.  rc = U
4950: 6e 69 46 72 65 65 55 63 6f 6e 76 4f 62 6a 65 63  niFreeUconvObjec
4960: 74 28 75 63 6f 6e 76 29 3b 0a 0a 20 20 72 65 74  t(uconv);..  ret
4970: 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn out;.}../*.*
4980: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
4990: 6e 20 74 6f 20 63 6f 6e 76 65 72 74 20 66 69 6c  n to convert fil
49a0: 65 6e 61 6d 65 73 20 66 72 6f 6d 20 6c 6f 63 61  enames from loca
49b0: 6c 20 63 6f 64 65 70 61 67 65 20 74 6f 20 55 54  l codepage to UT
49c0: 46 2d 38 2e 0a 2a 2a 20 54 68 65 20 74 77 6f 2d  F-8..** The two-
49d0: 73 74 65 70 20 70 72 6f 63 65 73 73 3a 20 66 69  step process: fi
49e0: 72 73 74 20 63 6f 6e 76 65 72 74 20 74 68 65 20  rst convert the 
49f0: 69 6e 63 6f 6d 69 6e 67 20 63 6f 64 65 70 61 67  incoming codepag
4a00: 65 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 73 74  e-specific.** st
4a10: 72 69 6e 67 20 69 6e 74 6f 20 55 43 53 2d 32 20  ring into UCS-2 
4a20: 61 6e 64 20 74 68 65 6e 20 66 72 6f 6d 20 55 43  and then from UC
4a30: 53 2d 32 20 74 6f 20 74 68 65 20 63 6f 64 65 70  S-2 to the codep
4a40: 61 67 65 20 6f 66 20 55 54 46 2d 38 2e 0a 2a 2a  age of UTF-8..**
4a50: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 63 68   The returned ch
4a60: 61 72 20 70 6f 69 6e 74 65 72 20 68 61 73 20 74  ar pointer has t
4a70: 6f 20 62 65 20 66 72 65 65 64 2e 0a 2a 2f 0a 63  o be freed..*/.c
4a80: 68 61 72 20 2a 63 6f 6e 76 65 72 74 43 70 50 61  har *convertCpPa
4a90: 74 68 54 6f 55 74 66 38 28 63 6f 6e 73 74 20 63  thToUtf8(const c
4aa0: 68 61 72 20 2a 69 6e 29 0a 7b 0a 20 20 55 63 6f  har *in).{.  Uco
4ab0: 6e 76 4f 62 6a 65 63 74 20 75 63 6f 6e 76 3b 0a  nvObject uconv;.
4ac0: 20 20 55 6e 69 43 68 61 72 20 75 63 73 55 74 66    UniChar ucsUtf
4ad0: 38 43 70 5b 31 32 5d 2c 0a 20 20 20 20 20 20 20  8Cp[12],.       
4ae0: 20 20 20 74 65 6d 70 50 61 74 68 5b 43 43 48 4d     tempPath[CCHM
4af0: 41 58 50 41 54 48 5d 3b 0a 20 20 63 68 61 72 20  AXPATH];.  char 
4b00: 2a 6f 75 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *out;.  int rc =
4b10: 20 30 3b 0a 0a 20 20 6f 75 74 20 3d 20 28 63 68   0;..  out = (ch
4b20: 61 72 20 2a 29 63 61 6c 6c 6f 63 28 43 43 48 4d  ar *)calloc(CCHM
4b30: 41 58 50 41 54 48 2c 20 31 29 3b 0a 0a 20 20 2f  AXPATH, 1);..  /
4b40: 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 20 66 6f 72  * conversion for
4b50: 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67   current codepag
4b60: 65 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 75  e which can be u
4b70: 73 65 64 20 66 6f 72 20 70 61 74 68 73 20 2a 2f  sed for paths */
4b80: 0a 20 20 72 63 20 3d 20 55 6e 69 43 72 65 61 74  .  rc = UniCreat
4b90: 65 55 63 6f 6e 76 4f 62 6a 65 63 74 28 28 55 6e  eUconvObject((Un
4ba0: 69 43 68 61 72 20 2a 29 4c 22 40 70 61 74 68 3d  iChar *)L"@path=
4bb0: 79 65 73 22 2c 20 26 75 63 6f 6e 76 29 3b 0a 20  yes", &uconv);. 
4bc0: 20 72 63 20 3d 20 55 6e 69 53 74 72 54 6f 55 63   rc = UniStrToUc
4bd0: 73 28 75 63 6f 6e 76 2c 20 74 65 6d 70 50 61 74  s(uconv, tempPat
4be0: 68 2c 20 28 63 68 61 72 20 2a 29 69 6e 2c 20 43  h, (char *)in, C
4bf0: 43 48 4d 41 58 50 41 54 48 29 3b 0a 20 20 72 63  CHMAXPATH);.  rc
4c00: 20 3d 20 55 6e 69 46 72 65 65 55 63 6f 6e 76 4f   = UniFreeUconvO
4c10: 62 6a 65 63 74 28 75 63 6f 6e 76 29 3b 0a 0a 20  bject(uconv);.. 
4c20: 20 2f 2a 20 64 65 74 65 72 6d 69 6e 65 20 73 74   /* determine st
4c30: 72 69 6e 67 20 66 6f 72 20 74 68 65 20 63 6f 6e  ring for the con
4c40: 76 65 72 73 69 6f 6e 20 6f 66 20 55 54 46 2d 38  version of UTF-8
4c50: 20 77 68 69 63 68 20 69 73 20 43 50 31 32 30 38   which is CP1208
4c60: 20 2a 2f 0a 20 20 72 63 20 3d 20 55 6e 69 4d 61   */.  rc = UniMa
4c70: 70 43 70 54 6f 55 63 73 43 70 28 31 32 30 38 2c  pCpToUcsCp(1208,
4c80: 20 75 63 73 55 74 66 38 43 70 2c 20 31 32 29 3b   ucsUtf8Cp, 12);
4c90: 0a 20 20 72 63 20 3d 20 55 6e 69 43 72 65 61 74  .  rc = UniCreat
4ca0: 65 55 63 6f 6e 76 4f 62 6a 65 63 74 28 75 63 73  eUconvObject(ucs
4cb0: 55 74 66 38 43 70 2c 20 26 75 63 6f 6e 76 29 3b  Utf8Cp, &uconv);
4cc0: 0a 20 20 72 63 20 3d 20 55 6e 69 53 74 72 46 72  .  rc = UniStrFr
4cd0: 6f 6d 55 63 73 28 75 63 6f 6e 76 2c 20 6f 75 74  omUcs(uconv, out
4ce0: 2c 20 74 65 6d 70 50 61 74 68 2c 20 43 43 48 4d  , tempPath, CCHM
4cf0: 41 58 50 41 54 48 29 3b 0a 20 20 72 63 20 3d 20  AXPATH);.  rc = 
4d00: 55 6e 69 46 72 65 65 55 63 6f 6e 76 4f 62 6a 65  UniFreeUconvObje
4d10: 63 74 28 75 63 6f 6e 76 29 3b 0a 0a 20 20 72 65  ct(uconv);..  re
4d20: 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a  turn out;.}../*.
4d30: 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64  ** This vector d
4d40: 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d  efines all the m
4d50: 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20  ethods that can 
4d60: 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a  operate on an.**
4d70: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f   sqlite3_file fo
4d80: 72 20 6f 73 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  r os2..*/.static
4d90: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
4da0: 6f 5f 6d 65 74 68 6f 64 73 20 6f 73 32 49 6f 4d  o_methods os2IoM
4db0: 65 74 68 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20  ethod = {.  1,  
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dd0: 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
4de0: 6e 20 2a 2f 0a 20 20 6f 73 32 43 6c 6f 73 65 2c  n */.  os2Close,
4df0: 0a 20 20 6f 73 32 52 65 61 64 2c 0a 20 20 6f 73  .  os2Read,.  os
4e00: 32 57 72 69 74 65 2c 0a 20 20 6f 73 32 54 72 75  2Write,.  os2Tru
4e10: 6e 63 61 74 65 2c 0a 20 20 6f 73 32 53 79 6e 63  ncate,.  os2Sync
4e20: 2c 0a 20 20 6f 73 32 46 69 6c 65 53 69 7a 65 2c  ,.  os2FileSize,
4e30: 0a 20 20 6f 73 32 4c 6f 63 6b 2c 0a 20 20 6f 73  .  os2Lock,.  os
4e40: 32 55 6e 6c 6f 63 6b 2c 0a 20 20 6f 73 32 43 68  2Unlock,.  os2Ch
4e50: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
4e60: 0a 20 20 6f 73 32 46 69 6c 65 43 6f 6e 74 72 6f  .  os2FileContro
4e70: 6c 2c 0a 20 20 6f 73 32 53 65 63 74 6f 72 53 69  l,.  os2SectorSi
4e80: 7a 65 2c 0a 20 20 6f 73 32 44 65 76 69 63 65 43  ze,.  os2DeviceC
4e90: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 0a 7d  haracteristics.}
4ea0: 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;../************
4eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
4ef0: 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65  ** Here ends the
4f00: 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 74 68 61   I/O methods tha
4f10: 74 20 66 6f 72 6d 20 74 68 65 20 73 71 6c 69 74  t form the sqlit
4f20: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
4f30: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
4f40: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
4f50: 64 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  de implements th
4f60: 65 20 56 46 53 20 6d 65 74 68 6f 64 73 2e 0a 2a  e VFS methods..*
4f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
4fc0: 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e  .** Open a file.
4fd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
4fe0: 73 32 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  s2Open(.  sqlite
4ff0: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
5000: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
5010: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
5020: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
5030: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
5040: 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
5050: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
5060: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
5070: 20 57 72 69 74 65 20 74 68 65 20 53 51 4c 69 74   Write the SQLit
5080: 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65  e file handle he
5090: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
50a0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
50b0: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f        /* Open mo
50c0: 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e  de flags */.  in
50d0: 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20  t *pOutFlags    
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
50f0: 74 61 74 75 73 20 72 65 74 75 72 6e 20 66 6c 61  tatus return fla
5100: 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 46 49 4c 45  gs */.){.  HFILE
5110: 20 68 3b 0a 20 20 55 4c 4f 4e 47 20 75 6c 46 69   h;.  ULONG ulFi
5120: 6c 65 41 74 74 72 69 62 75 74 65 20 3d 20 30 3b  leAttribute = 0;
5130: 0a 20 20 55 4c 4f 4e 47 20 75 6c 4f 70 65 6e 46  .  ULONG ulOpenF
5140: 6c 61 67 73 20 3d 20 30 3b 0a 20 20 55 4c 4f 4e  lags = 0;.  ULON
5150: 47 20 75 6c 4f 70 65 6e 4d 6f 64 65 20 3d 20 30  G ulOpenMode = 0
5160: 3b 0a 20 20 6f 73 32 46 69 6c 65 20 2a 70 46 69  ;.  os2File *pFi
5170: 6c 65 20 3d 20 28 6f 73 32 46 69 6c 65 2a 29 69  le = (os2File*)i
5180: 64 3b 0a 20 20 41 50 49 52 45 54 20 72 63 20 3d  d;.  APIRET rc =
5190: 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 55 4c 4f   NO_ERROR;.  ULO
51a0: 4e 47 20 75 6c 41 63 74 69 6f 6e 3b 0a 20 20 63  NG ulAction;.  c
51b0: 68 61 72 20 2a 7a 4e 61 6d 65 43 70 3b 0a 0a 20  har *zNameCp;.. 
51c0: 20 6d 65 6d 73 65 74 28 20 70 46 69 6c 65 2c 20   memset( pFile, 
51d0: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 65  0, sizeof(*pFile
51e0: 29 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 32  ) );..  OSTRACE2
51f0: 28 20 22 4f 50 45 4e 20 77 61 6e 74 20 25 64 5c  ( "OPEN want %d\
5200: 6e 22 2c 20 66 6c 61 67 73 20 29 3b 0a 0a 20 20  n", flags );..  
5210: 2f 2f 75 6c 4f 70 65 6e 4d 6f 64 65 20 3d 20 66  //ulOpenMode = f
5220: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
5230: 45 4e 5f 52 45 41 44 57 52 49 54 45 20 3f 20 4f  EN_READWRITE ? O
5240: 50 45 4e 5f 41 43 43 45 53 53 5f 52 45 41 44 57  PEN_ACCESS_READW
5250: 52 49 54 45 20 3a 20 4f 50 45 4e 5f 41 43 43 45  RITE : OPEN_ACCE
5260: 53 53 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 69  SS_READONLY;.  i
5270: 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
5280: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
5290: 20 29 7b 0a 20 20 20 20 75 6c 4f 70 65 6e 4d 6f   ){.    ulOpenMo
52a0: 64 65 20 7c 3d 20 4f 50 45 4e 5f 41 43 43 45 53  de |= OPEN_ACCES
52b0: 53 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20  S_READWRITE;.   
52c0: 20 4f 53 54 52 41 43 45 31 28 20 22 4f 50 45 4e   OSTRACE1( "OPEN
52d0: 20 72 65 61 64 2f 77 72 69 74 65 5c 6e 22 20 29   read/write\n" )
52e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
52f0: 6c 4f 70 65 6e 4d 6f 64 65 20 7c 3d 20 4f 50 45  lOpenMode |= OPE
5300: 4e 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c  N_ACCESS_READONL
5310: 59 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 31 28  Y;.    OSTRACE1(
5320: 20 22 4f 50 45 4e 20 72 65 61 64 20 6f 6e 6c 79   "OPEN read only
5330: 5c 6e 22 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2f  \n" );.  }..  //
5340: 75 6c 4f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c  ulOpenFlags = fl
5350: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
5360: 4e 5f 43 52 45 41 54 45 20 3f 20 4f 50 45 4e 5f  N_CREATE ? OPEN_
5370: 41 43 54 49 4f 4e 5f 43 52 45 41 54 45 5f 49 46  ACTION_CREATE_IF
5380: 5f 4e 45 57 20 3a 20 4f 50 45 4e 5f 41 43 54 49  _NEW : OPEN_ACTI
5390: 4f 4e 5f 46 41 49 4c 5f 49 46 5f 4e 45 57 3b 0a  ON_FAIL_IF_NEW;.
53a0: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
53b0: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
53c0: 20 29 7b 0a 20 20 20 20 75 6c 4f 70 65 6e 46 6c   ){.    ulOpenFl
53d0: 61 67 73 20 7c 3d 20 4f 50 45 4e 5f 41 43 54 49  ags |= OPEN_ACTI
53e0: 4f 4e 5f 4f 50 45 4e 5f 49 46 5f 45 58 49 53 54  ON_OPEN_IF_EXIST
53f0: 53 20 7c 20 4f 50 45 4e 5f 41 43 54 49 4f 4e 5f  S | OPEN_ACTION_
5400: 43 52 45 41 54 45 5f 49 46 5f 4e 45 57 3b 0a 20  CREATE_IF_NEW;. 
5410: 20 20 20 4f 53 54 52 41 43 45 31 28 20 22 4f 50     OSTRACE1( "OP
5420: 45 4e 20 6f 70 65 6e 20 6e 65 77 2f 63 72 65 61  EN open new/crea
5430: 74 65 5c 6e 22 20 29 3b 0a 20 20 7d 65 6c 73 65  te\n" );.  }else
5440: 7b 0a 20 20 20 20 75 6c 4f 70 65 6e 46 6c 61 67  {.    ulOpenFlag
5450: 73 20 7c 3d 20 4f 50 45 4e 5f 41 43 54 49 4f 4e  s |= OPEN_ACTION
5460: 5f 4f 50 45 4e 5f 49 46 5f 45 58 49 53 54 53 20  _OPEN_IF_EXISTS 
5470: 7c 20 4f 50 45 4e 5f 41 43 54 49 4f 4e 5f 46 41  | OPEN_ACTION_FA
5480: 49 4c 5f 49 46 5f 4e 45 57 3b 0a 20 20 20 20 4f  IL_IF_NEW;.    O
5490: 53 54 52 41 43 45 31 28 20 22 4f 50 45 4e 20 6f  STRACE1( "OPEN o
54a0: 70 65 6e 20 65 78 69 73 74 69 6e 67 5c 6e 22 20  pen existing\n" 
54b0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2f 75 6c 4f 70  );.  }..  //ulOp
54c0: 65 6e 4d 6f 64 65 20 7c 3d 20 66 6c 61 67 73 20  enMode |= flags 
54d0: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
54e0: 49 4e 5f 44 42 20 3f 20 4f 50 45 4e 5f 53 48 41  IN_DB ? OPEN_SHA
54f0: 52 45 5f 44 45 4e 59 4e 4f 4e 45 20 3a 20 4f 50  RE_DENYNONE : OP
5500: 45 4e 5f 53 48 41 52 45 5f 44 45 4e 59 57 52 49  EN_SHARE_DENYWRI
5510: 54 45 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  TE;.  if( flags 
5520: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
5530: 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 75 6c 4f  IN_DB ){.    ulO
5540: 70 65 6e 4d 6f 64 65 20 7c 3d 20 4f 50 45 4e 5f  penMode |= OPEN_
5550: 53 48 41 52 45 5f 44 45 4e 59 4e 4f 4e 45 3b 0a  SHARE_DENYNONE;.
5560: 20 20 20 20 4f 53 54 52 41 43 45 31 28 20 22 4f      OSTRACE1( "O
5570: 50 45 4e 20 73 68 61 72 65 20 72 65 61 64 2f 77  PEN share read/w
5580: 72 69 74 65 5c 6e 22 20 29 3b 0a 20 20 7d 65 6c  rite\n" );.  }el
5590: 73 65 7b 0a 20 20 20 20 75 6c 4f 70 65 6e 4d 6f  se{.    ulOpenMo
55a0: 64 65 20 7c 3d 20 4f 50 45 4e 5f 53 48 41 52 45  de |= OPEN_SHARE
55b0: 5f 44 45 4e 59 57 52 49 54 45 3b 0a 20 20 20 20  _DENYWRITE;.    
55c0: 4f 53 54 52 41 43 45 31 28 20 22 4f 50 45 4e 20  OSTRACE1( "OPEN 
55d0: 73 68 61 72 65 20 72 65 61 64 20 6f 6e 6c 79 5c  share read only\
55e0: 6e 22 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n" );.  }..  if(
55f0: 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45   flags & (SQLITE
5600: 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20  _OPEN_TEMP_DB | 
5610: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
5620: 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20 20  _JOURNAL.       
5630: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
5640: 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
5650: 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 70 61  ) ){.    char pa
5660: 74 68 55 74 66 38 5b 43 43 48 4d 41 58 50 41 54  thUtf8[CCHMAXPAT
5670: 48 5d 3b 0a 20 20 20 20 2f 2f 75 6c 46 69 6c 65  H];.    //ulFile
5680: 41 74 74 72 69 62 75 74 65 20 3d 20 46 49 4c 45  Attribute = FILE
5690: 5f 48 49 44 44 45 4e 3b 20 20 2f 2f 66 6f 72 20  _HIDDEN;  //for 
56a0: 64 65 62 75 67 67 69 6e 67 2c 20 77 65 20 77 61  debugging, we wa
56b0: 6e 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  nt to make sure 
56c0: 69 74 20 69 73 20 64 65 6c 65 74 65 64 0a 20 20  it is deleted.  
56d0: 20 20 75 6c 46 69 6c 65 41 74 74 72 69 62 75 74    ulFileAttribut
56e0: 65 20 3d 20 46 49 4c 45 5f 4e 4f 52 4d 41 4c 3b  e = FILE_NORMAL;
56f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75  .    sqlite3OsFu
5700: 6c 6c 50 61 74 68 6e 61 6d 65 28 20 70 56 66 73  llPathname( pVfs
5710: 2c 20 7a 4e 61 6d 65 2c 20 43 43 48 4d 41 58 50  , zName, CCHMAXP
5720: 41 54 48 2c 20 70 61 74 68 55 74 66 38 20 29 3b  ATH, pathUtf8 );
5730: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 61 74 68  .    pFile->path
5740: 54 6f 44 65 6c 20 3d 20 63 6f 6e 76 65 72 74 55  ToDel = convertU
5750: 74 66 38 50 61 74 68 54 6f 43 70 28 20 70 61 74  tf8PathToCp( pat
5760: 68 55 74 66 38 20 29 3b 0a 20 20 20 20 4f 53 54  hUtf8 );.    OST
5770: 52 41 43 45 31 28 20 22 4f 50 45 4e 20 68 69 64  RACE1( "OPEN hid
5780: 64 65 6e 2f 64 65 6c 65 74 65 20 6f 6e 20 63 6c  den/delete on cl
5790: 6f 73 65 20 66 69 6c 65 20 61 74 74 72 69 62 75  ose file attribu
57a0: 74 65 73 5c 6e 22 20 29 3b 0a 20 20 7d 65 6c 73  tes\n" );.  }els
57b0: 65 7b 0a 20 20 20 20 75 6c 46 69 6c 65 41 74 74  e{.    ulFileAtt
57c0: 72 69 62 75 74 65 20 3d 20 46 49 4c 45 5f 41 52  ribute = FILE_AR
57d0: 43 48 49 56 45 44 20 7c 20 46 49 4c 45 5f 4e 4f  CHIVED | FILE_NO
57e0: 52 4d 41 4c 3b 0a 20 20 20 20 70 46 69 6c 65 2d  RMAL;.    pFile-
57f0: 3e 70 61 74 68 54 6f 44 65 6c 20 3d 20 4e 55 4c  >pathToDel = NUL
5800: 4c 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 31 28  L;.    OSTRACE1(
5810: 20 22 4f 50 45 4e 20 6e 6f 72 6d 61 6c 20 66 69   "OPEN normal fi
5820: 6c 65 20 61 74 74 72 69 62 75 74 65 5c 6e 22 20  le attribute\n" 
5830: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 6c 77  );.  }..  /* alw
5840: 61 79 73 20 6f 70 65 6e 20 69 6e 20 72 61 6e 64  ays open in rand
5850: 6f 6d 20 61 63 63 65 73 73 20 6d 6f 64 65 20 66  om access mode f
5860: 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 74 74  or possibly bett
5870: 65 72 20 73 70 65 65 64 20 2a 2f 0a 20 20 75 6c  er speed */.  ul
5880: 4f 70 65 6e 4d 6f 64 65 20 7c 3d 20 4f 50 45 4e  OpenMode |= OPEN
5890: 5f 46 4c 41 47 53 5f 52 41 4e 44 4f 4d 3b 0a 20  _FLAGS_RANDOM;. 
58a0: 20 75 6c 4f 70 65 6e 4d 6f 64 65 20 7c 3d 20 4f   ulOpenMode |= O
58b0: 50 45 4e 5f 46 4c 41 47 53 5f 46 41 49 4c 5f 4f  PEN_FLAGS_FAIL_O
58c0: 4e 5f 45 52 52 4f 52 3b 0a 20 20 75 6c 4f 70 65  N_ERROR;.  ulOpe
58d0: 6e 4d 6f 64 65 20 7c 3d 20 4f 50 45 4e 5f 46 4c  nMode |= OPEN_FL
58e0: 41 47 53 5f 4e 4f 49 4e 48 45 52 49 54 3b 0a 0a  AGS_NOINHERIT;..
58f0: 20 20 7a 4e 61 6d 65 43 70 20 3d 20 63 6f 6e 76    zNameCp = conv
5900: 65 72 74 55 74 66 38 50 61 74 68 54 6f 43 70 28  ertUtf8PathToCp(
5910: 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 72 63 20 3d   zName );.  rc =
5920: 20 44 6f 73 4f 70 65 6e 28 20 28 50 53 5a 29 7a   DosOpen( (PSZ)z
5930: 4e 61 6d 65 43 70 2c 0a 20 20 20 20 20 20 20 20  NameCp,.        
5940: 20 20 20 20 20 20 20 20 26 68 2c 0a 20 20 20 20          &h,.    
5950: 20 20 20 20 20 20 20 20 20 20 20 20 26 75 6c 41              &ulA
5960: 63 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ction,.         
5970: 20 20 20 20 20 20 20 30 4c 2c 0a 20 20 20 20 20         0L,.     
5980: 20 20 20 20 20 20 20 20 20 20 20 75 6c 46 69 6c             ulFil
5990: 65 41 74 74 72 69 62 75 74 65 2c 0a 20 20 20 20  eAttribute,.    
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 75 6c 4f 70              ulOp
59b0: 65 6e 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  enFlags,.       
59c0: 20 20 20 20 20 20 20 20 20 75 6c 4f 70 65 6e 4d           ulOpenM
59d0: 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ode,.           
59e0: 20 20 20 20 20 28 50 45 41 4f 50 32 29 4e 55 4c       (PEAOP2)NUL
59f0: 4c 20 29 3b 0a 20 20 66 72 65 65 28 20 7a 4e 61  L );.  free( zNa
5a00: 6d 65 43 70 20 29 3b 0a 20 20 69 66 28 20 72 63  meCp );.  if( rc
5a10: 20 21 3d 20 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a   != NO_ERROR ){.
5a20: 20 20 20 20 4f 53 54 52 41 43 45 37 28 20 22 4f      OSTRACE7( "O
5a30: 50 45 4e 20 49 6e 76 61 6c 69 64 20 68 61 6e 64  PEN Invalid hand
5a40: 6c 65 20 72 63 3d 25 64 3a 20 7a 4e 61 6d 65 3d  le rc=%d: zName=
5a50: 25 73 2c 20 75 6c 41 63 74 69 6f 6e 3d 25 23 6c  %s, ulAction=%#l
5a60: 78 2c 20 75 6c 41 74 74 72 3d 25 23 6c 78 2c 20  x, ulAttr=%#lx, 
5a70: 75 6c 46 6c 61 67 73 3d 25 23 6c 78 2c 20 75 6c  ulFlags=%#lx, ul
5a80: 4d 6f 64 65 3d 25 23 6c 78 5c 6e 22 2c 0a 20 20  Mode=%#lx\n",.  
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 2c 20              rc, 
5aa0: 7a 4e 61 6d 65 2c 20 75 6c 41 63 74 69 6f 6e 2c  zName, ulAction,
5ab0: 20 75 6c 46 69 6c 65 41 74 74 72 69 62 75 74 65   ulFileAttribute
5ac0: 2c 20 75 6c 4f 70 65 6e 46 6c 61 67 73 2c 20 75  , ulOpenFlags, u
5ad0: 6c 4f 70 65 6e 4d 6f 64 65 20 29 3b 0a 20 20 20  lOpenMode );.   
5ae0: 20 66 72 65 65 28 20 70 46 69 6c 65 2d 3e 70 61   free( pFile->pa
5af0: 74 68 54 6f 44 65 6c 20 29 3b 0a 20 20 20 20 70  thToDel );.    p
5b00: 46 69 6c 65 2d 3e 70 61 74 68 54 6f 44 65 6c 20  File->pathToDel 
5b10: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20  = NULL;.    if( 
5b20: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
5b30: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 29 7b  PEN_READWRITE ){
5b40: 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 32 28  .      OSTRACE2(
5b50: 20 22 4f 50 45 4e 20 25 64 20 49 6e 76 61 6c 69   "OPEN %d Invali
5b60: 64 20 68 61 6e 64 6c 65 5c 6e 22 2c 20 28 28 66  d handle\n", ((f
5b70: 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50  lags | SQLITE_OP
5b80: 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26 20 7e  EN_READONLY) & ~
5b90: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
5ba0: 57 52 49 54 45 29 20 29 3b 0a 20 20 20 20 20 20  WRITE) );.      
5bb0: 72 65 74 75 72 6e 20 6f 73 32 4f 70 65 6e 28 20  return os2Open( 
5bc0: 30 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 0a 20 20  0, zName, id,.  
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5be0: 20 20 20 20 28 28 66 6c 61 67 73 20 7c 20 53 51      ((flags | SQ
5bf0: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
5c00: 4c 59 29 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50  LY) & ~SQLITE_OP
5c10: 45 4e 5f 52 45 41 44 57 52 49 54 45 29 2c 0a 20  EN_READWRITE),. 
5c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c30: 20 20 20 20 20 70 4f 75 74 46 6c 61 67 73 20 29       pOutFlags )
5c40: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5c50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5c60: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d  _CANTOPEN;.    }
5c70: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74  .  }..  if( pOut
5c80: 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f  Flags ){.    *pO
5c90: 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 20  utFlags = flags 
5ca0: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
5cb0: 41 44 57 52 49 54 45 20 3f 20 53 51 4c 49 54 45  ADWRITE ? SQLITE
5cc0: 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
5cd0: 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  : SQLITE_OPEN_RE
5ce0: 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 70  ADONLY;.  }..  p
5cf0: 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  File->pMethod = 
5d00: 26 6f 73 32 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  &os2IoMethod;.  
5d10: 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20  pFile->h = h;.  
5d20: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
5d30: 0a 20 20 4f 53 54 52 41 43 45 33 28 20 22 4f 50  .  OSTRACE3( "OP
5d40: 45 4e 20 25 64 20 70 4f 75 74 46 6c 61 67 73 3d  EN %d pOutFlags=
5d50: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
5d60: 20 70 4f 75 74 46 6c 61 67 73 20 29 3b 0a 20 20   pOutFlags );.  
5d70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5d80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
5d90: 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65  e the named file
5da0: 2e 0a 2a 2f 0a 69 6e 74 20 6f 73 32 44 65 6c 65  ..*/.int os2Dele
5db0: 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  te(.  sqlite3_vf
5dc0: 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5de0: 4e 6f 74 20 75 73 65 64 20 6f 6e 20 6f 73 32 20  Not used on os2 
5df0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
5e00: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  *zFilename,     
5e10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5e20: 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64  ame of file to d
5e30: 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73  elete */.  int s
5e40: 79 6e 63 44 69 72 20 20 20 20 20 20 20 20 20 20  yncDir          
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
5e70: 20 6f 73 32 20 2a 2f 0a 29 7b 0a 20 20 41 50 49   os2 */.){.  API
5e80: 52 45 54 20 72 63 20 3d 20 4e 4f 5f 45 52 52 4f  RET rc = NO_ERRO
5e90: 52 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  R;.  SimulateIOE
5ea0: 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
5eb0: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29  TE_IOERR_DELETE)
5ec0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  ;.  char *zFilen
5ed0: 61 6d 65 43 70 20 3d 20 63 6f 6e 76 65 72 74 55  ameCp = convertU
5ee0: 74 66 38 50 61 74 68 54 6f 43 70 28 20 7a 46 69  tf8PathToCp( zFi
5ef0: 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 72 63 20 3d  lename );.  rc =
5f00: 20 44 6f 73 44 65 6c 65 74 65 28 20 28 50 53 5a   DosDelete( (PSZ
5f10: 29 7a 46 69 6c 65 6e 61 6d 65 43 70 20 29 3b 0a  )zFilenameCp );.
5f20: 20 20 66 72 65 65 28 20 7a 46 69 6c 65 6e 61 6d    free( zFilenam
5f30: 65 43 70 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  eCp );.  OSTRACE
5f40: 32 28 20 22 44 45 4c 45 54 45 20 5c 22 25 73 5c  2( "DELETE \"%s\
5f50: 22 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 20  "\n", zFilename 
5f60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3d  );.  return rc =
5f70: 3d 20 4e 4f 5f 45 52 52 4f 52 20 3f 20 53 51 4c  = NO_ERROR ? SQL
5f80: 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f  ITE_OK : SQLITE_
5f90: 49 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  IOERR;.}../*.** 
5fa0: 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74 61  Check the exista
5fb0: 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f  nce and status o
5fc0: 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  f a file..*/.sta
5fd0: 74 69 63 20 69 6e 74 20 6f 73 32 41 63 63 65 73  tic int os2Acces
5fe0: 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
5ff0: 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 2f   *pVfs,        /
6000: 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 6f 73  * Not used on os
6010: 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
6020: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
6030: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
6040: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
6050: 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
6060: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
6070: 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65   of test to make
6080: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
6090: 0a 29 7b 0a 20 20 46 49 4c 45 53 54 41 54 55 53  .){.  FILESTATUS
60a0: 33 20 66 73 74 73 33 43 6f 6e 66 69 67 49 6e 66  3 fsts3ConfigInf
60b0: 6f 3b 0a 20 20 41 50 49 52 45 54 20 72 63 20 3d  o;.  APIRET rc =
60c0: 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 6d 65   NO_ERROR;..  me
60d0: 6d 73 65 74 28 20 26 66 73 74 73 33 43 6f 6e 66  mset( &fsts3Conf
60e0: 69 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  igInfo, 0, sizeo
60f0: 66 28 66 73 74 73 33 43 6f 6e 66 69 67 49 6e 66  f(fsts3ConfigInf
6100: 6f 29 20 29 3b 0a 20 20 63 68 61 72 20 2a 7a 46  o) );.  char *zF
6110: 69 6c 65 6e 61 6d 65 43 70 20 3d 20 63 6f 6e 76  ilenameCp = conv
6120: 65 72 74 55 74 66 38 50 61 74 68 54 6f 43 70 28  ertUtf8PathToCp(
6130: 20 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20   zFilename );.  
6140: 72 63 20 3d 20 44 6f 73 51 75 65 72 79 50 61 74  rc = DosQueryPat
6150: 68 49 6e 66 6f 28 20 28 50 53 5a 29 7a 46 69 6c  hInfo( (PSZ)zFil
6160: 65 6e 61 6d 65 43 70 2c 20 46 49 4c 5f 53 54 41  enameCp, FIL_STA
6170: 4e 44 41 52 44 2c 0a 20 20 20 20 20 20 20 20 20  NDARD,.         
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6190: 26 66 73 74 73 33 43 6f 6e 66 69 67 49 6e 66 6f  &fsts3ConfigInfo
61a0: 2c 20 73 69 7a 65 6f 66 28 46 49 4c 45 53 54 41  , sizeof(FILESTA
61b0: 54 55 53 33 29 20 29 3b 0a 20 20 66 72 65 65 28  TUS3) );.  free(
61c0: 20 7a 46 69 6c 65 6e 61 6d 65 43 70 20 29 3b 0a   zFilenameCp );.
61d0: 20 20 4f 53 54 52 41 43 45 34 28 20 22 41 43 43    OSTRACE4( "ACC
61e0: 45 53 53 20 66 73 74 73 33 43 6f 6e 66 69 67 49  ESS fsts3ConfigI
61f0: 6e 66 6f 2e 61 74 74 72 46 69 6c 65 3d 25 64 20  nfo.attrFile=%d 
6200: 66 6c 61 67 73 3d 25 64 20 72 63 3d 25 64 5c 6e  flags=%d rc=%d\n
6210: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ",.            f
6220: 73 74 73 33 43 6f 6e 66 69 67 49 6e 66 6f 2e 61  sts3ConfigInfo.a
6230: 74 74 72 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20  ttrFile, flags, 
6240: 72 63 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  rc );.  switch( 
6250: 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73  flags ){.    cas
6260: 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
6270: 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53  READ:.    case S
6280: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
6290: 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20  STS:.      rc = 
62a0: 28 72 63 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 29  (rc == NO_ERROR)
62b0: 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 33  ;.      OSTRACE3
62c0: 28 20 22 41 43 43 45 53 53 20 25 73 20 61 63 63  ( "ACCESS %s acc
62d0: 65 73 73 20 6f 66 20 72 65 61 64 20 61 6e 64 20  ess of read and 
62e0: 65 78 69 73 74 73 20 20 72 63 3d 25 64 5c 6e 22  exists  rc=%d\n"
62f0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 72 63 20  , zFilename, rc 
6300: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6310: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6320: 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
6330: 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 28 66 73  :.      rc = (fs
6340: 74 73 33 43 6f 6e 66 69 67 49 6e 66 6f 2e 61 74  ts3ConfigInfo.at
6350: 74 72 46 69 6c 65 20 26 20 46 49 4c 45 5f 52 45  trFile & FILE_RE
6360: 41 44 4f 4e 4c 59 29 20 3d 3d 20 30 3b 0a 20 20  ADONLY) == 0;.  
6370: 20 20 20 20 4f 53 54 52 41 43 45 33 28 20 22 41      OSTRACE3( "A
6380: 43 43 45 53 53 20 25 73 20 61 63 63 65 73 73 20  CCESS %s access 
6390: 6f 66 20 72 65 61 64 2f 77 72 69 74 65 20 20 72  of read/write  r
63a0: 63 3d 25 64 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  c=%d\n", zFilena
63b0: 6d 65 2c 20 72 63 20 29 3b 0a 20 20 20 20 20 20  me, rc );.      
63c0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
63d0: 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
63e0: 28 20 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67  ( !"Invalid flag
63f0: 73 20 61 72 67 75 6d 65 6e 74 22 20 29 3b 0a 20  s argument" );. 
6400: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
6410: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  }.../*.** Create
6420: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
6430: 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20  e name in zBuf. 
6440: 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62 69   zBuf must be bi
6450: 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68  g enough to.** h
6460: 6f 6c 64 20 61 74 20 70 56 66 73 2d 3e 6d 78 50  old at pVfs->mxP
6470: 61 74 68 6e 61 6d 65 20 63 68 61 72 61 63 74 65  athname characte
6480: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
6490: 74 20 6f 73 32 47 65 74 54 65 6d 70 6e 61 6d 65  t os2GetTempname
64a0: 28 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  ( sqlite3_vfs *p
64b0: 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
64c0: 68 61 72 20 2a 7a 42 75 66 20 29 7b 0a 20 20 73  har *zBuf ){.  s
64d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
64e0: 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73  gned char zChars
64f0: 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66  [] =.    "abcdef
6500: 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
6510: 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45  wxyz".    "ABCDE
6520: 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
6530: 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33  VWXYZ".    "0123
6540: 34 35 36 37 38 39 22 3b 0a 20 20 69 6e 74 20 69  456789";.  int i
6550: 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d  , j;.  char zTem
6560: 70 50 61 74 68 42 75 66 5b 33 5d 3b 0a 20 20 50  pPathBuf[3];.  P
6570: 53 5a 20 7a 54 65 6d 70 50 61 74 68 20 3d 20 28  SZ zTempPath = (
6580: 50 53 5a 29 26 7a 54 65 6d 70 50 61 74 68 42 75  PSZ)&zTempPathBu
6590: 66 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  f;.  char *zTemp
65a0: 50 61 74 68 55 54 46 3b 0a 20 20 69 66 28 20 44  PathUTF;.  if( D
65b0: 6f 73 53 63 61 6e 45 6e 76 28 20 28 50 53 5a 29  osScanEnv( (PSZ)
65c0: 22 54 45 4d 50 22 2c 20 26 7a 54 65 6d 70 50 61  "TEMP", &zTempPa
65d0: 74 68 20 29 20 29 7b 0a 20 20 20 20 69 66 28 20  th ) ){.    if( 
65e0: 44 6f 73 53 63 61 6e 45 6e 76 28 20 28 50 53 5a  DosScanEnv( (PSZ
65f0: 29 22 54 4d 50 22 2c 20 26 7a 54 65 6d 70 50 61  )"TMP", &zTempPa
6600: 74 68 20 29 20 29 7b 0a 20 20 20 20 20 20 69 66  th ) ){.      if
6610: 28 20 44 6f 73 53 63 61 6e 45 6e 76 28 20 28 50  ( DosScanEnv( (P
6620: 53 5a 29 22 54 4d 50 44 49 52 22 2c 20 26 7a 54  SZ)"TMPDIR", &zT
6630: 65 6d 70 50 61 74 68 20 29 20 29 7b 0a 20 20 20  empPath ) ){.   
6640: 20 20 20 20 20 20 20 20 55 4c 4f 4e 47 20 75 6c          ULONG ul
6650: 44 72 69 76 65 4e 75 6d 20 3d 20 30 2c 20 75 6c  DriveNum = 0, ul
6660: 44 72 69 76 65 4d 61 70 20 3d 20 30 3b 0a 20 20  DriveMap = 0;.  
6670: 20 20 20 20 20 20 20 20 20 44 6f 73 51 75 65 72           DosQuer
6680: 79 43 75 72 72 65 6e 74 44 69 73 6b 28 20 26 75  yCurrentDisk( &u
6690: 6c 44 72 69 76 65 4e 75 6d 2c 20 26 75 6c 44 72  lDriveNum, &ulDr
66a0: 69 76 65 4d 61 70 20 29 3b 0a 20 20 20 20 20 20  iveMap );.      
66b0: 20 20 20 20 20 73 70 72 69 6e 74 66 28 20 28 63       sprintf( (c
66c0: 68 61 72 2a 29 7a 54 65 6d 70 50 61 74 68 2c 20  har*)zTempPath, 
66d0: 22 25 63 3a 22 2c 20 28 63 68 61 72 29 28 20 27  "%c:", (char)( '
66e0: 41 27 20 2b 20 75 6c 44 72 69 76 65 4e 75 6d 20  A' + ulDriveNum 
66f0: 2d 20 31 20 29 20 29 3b 0a 20 20 20 20 20 20 7d  - 1 ) );.      }
6700: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
6710: 73 74 72 69 70 20 6f 66 66 20 61 20 74 72 61 69  strip off a trai
6720: 6c 69 6e 67 20 73 6c 61 73 68 65 73 20 6f 72 20  ling slashes or 
6730: 62 61 63 6b 73 6c 61 73 68 65 73 2c 20 6f 74 68  backslashes, oth
6740: 65 72 77 69 73 65 20 77 65 20 77 6f 75 6c 64 20  erwise we would 
6750: 67 65 74 20 2a 0a 20 20 20 2a 20 6d 75 6c 74 69  get *.   * multi
6760: 70 6c 65 20 28 62 61 63 6b 29 73 6c 61 73 68 65  ple (back)slashe
6770: 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20 44  s which causes D
6780: 6f 73 4f 70 65 6e 28 29 20 74 6f 20 66 61 69 6c  osOpen() to fail
6790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
67a0: 2f 0a 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a  /.  j = strlen(z
67b0: 54 65 6d 70 50 61 74 68 29 3b 0a 20 20 77 68 69  TempPath);.  whi
67c0: 6c 65 28 20 6a 20 3e 20 30 20 26 26 20 28 20 7a  le( j > 0 && ( z
67d0: 54 65 6d 70 50 61 74 68 5b 6a 2d 31 5d 20 3d 3d  TempPath[j-1] ==
67e0: 20 27 5c 5c 27 20 7c 7c 20 7a 54 65 6d 70 50 61   '\\' || zTempPa
67f0: 74 68 5b 6a 2d 31 5d 20 3d 3d 20 27 2f 27 20 29  th[j-1] == '/' )
6800: 20 29 7b 0a 20 20 20 20 6a 2d 2d 3b 0a 20 20 7d   ){.    j--;.  }
6810: 0a 20 20 7a 54 65 6d 70 50 61 74 68 5b 6a 5d 20  .  zTempPath[j] 
6820: 3d 20 27 5c 30 27 3b 0a 20 20 7a 54 65 6d 70 50  = '\0';.  zTempP
6830: 61 74 68 55 54 46 20 3d 20 63 6f 6e 76 65 72 74  athUTF = convert
6840: 43 70 50 61 74 68 54 6f 55 74 66 38 28 20 7a 54  CpPathToUtf8( zT
6850: 65 6d 70 50 61 74 68 20 29 3b 0a 20 20 73 71 6c  empPath );.  sql
6860: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 20 6e  ite3_snprintf( n
6870: 42 75 66 2d 33 30 2c 20 7a 42 75 66 2c 0a 20 20  Buf-30, zBuf,.  
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6890: 20 20 22 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54    "%s\\"SQLITE_T
68a0: 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c  EMP_FILE_PREFIX,
68b0: 20 7a 54 65 6d 70 50 61 74 68 55 54 46 20 29 3b   zTempPathUTF );
68c0: 0a 20 20 66 72 65 65 28 20 7a 54 65 6d 70 50 61  .  free( zTempPa
68d0: 74 68 55 54 46 20 29 3b 0a 20 20 6a 20 3d 20 73  thUTF );.  j = s
68e0: 74 72 6c 65 6e 28 20 7a 42 75 66 20 29 3b 0a 20  trlen( zBuf );. 
68f0: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
6900: 65 73 73 28 20 32 30 2c 20 26 7a 42 75 66 5b 6a  ess( 20, &zBuf[j
6910: 5d 20 29 3b 0a 20 20 66 6f 72 28 20 69 20 3d 20  ] );.  for( i = 
6920: 30 3b 20 69 20 3c 20 32 30 3b 20 69 2b 2b 2c 20  0; i < 20; i++, 
6930: 6a 2b 2b 20 29 7b 0a 20 20 20 20 7a 42 75 66 5b  j++ ){.    zBuf[
6940: 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
6950: 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
6960: 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
6970: 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
6980: 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20  ;.  }.  zBuf[j] 
6990: 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 32 28  = 0;.  OSTRACE2(
69a0: 20 22 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a   "TEMP FILENAME:
69b0: 20 25 73 5c 6e 22 2c 20 7a 42 75 66 20 29 3b 0a   %s\n", zBuf );.
69c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
69d0: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75  OK;.}.../*.** Tu
69e0: 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rn a relative pa
69f0: 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75  thname into a fu
6a00: 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72  ll pathname.  Wr
6a10: 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20  ite the full.** 
6a20: 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 46  pathname into zF
6a30: 75 6c 6c 5b 5d 2e 20 20 7a 46 75 6c 6c 5b 5d 20  ull[].  zFull[] 
6a40: 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74  will be at least
6a50: 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
6a60: 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69  e.** bytes in si
6a70: 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
6a80: 74 20 6f 73 32 46 75 6c 6c 50 61 74 68 6e 61 6d  t os2FullPathnam
6a90: 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
6aa0: 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
6ab0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
6ac0: 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  fs object */.  c
6ad0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61  onst char *zRela
6ae0: 74 69 76 65 2c 20 20 20 20 20 20 2f 2a 20 50 6f  tive,      /* Po
6af0: 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
6b00: 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
6b10: 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20  int nFull,      
6b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
6b30: 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75  ize of output bu
6b40: 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ffer in bytes */
6b50: 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20  .  char *zFull  
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6b70: 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20  * Output buffer 
6b80: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52  */.){.  char *zR
6b90: 65 6c 61 74 69 76 65 43 70 20 3d 20 63 6f 6e 76  elativeCp = conv
6ba0: 65 72 74 55 74 66 38 50 61 74 68 54 6f 43 70 28  ertUtf8PathToCp(
6bb0: 20 7a 52 65 6c 61 74 69 76 65 20 29 3b 0a 20 20   zRelative );.  
6bc0: 63 68 61 72 20 7a 46 75 6c 6c 43 70 5b 43 43 48  char zFullCp[CCH
6bd0: 4d 41 58 50 41 54 48 5d 3b 0a 20 20 63 68 61 72  MAXPATH];.  char
6be0: 20 2a 7a 46 75 6c 6c 55 54 46 3b 0a 20 20 41 50   *zFullUTF;.  AP
6bf0: 49 52 45 54 20 72 63 20 3d 20 44 6f 73 51 75 65  IRET rc = DosQue
6c00: 72 79 50 61 74 68 49 6e 66 6f 28 20 7a 52 65 6c  ryPathInfo( zRel
6c10: 61 74 69 76 65 43 70 2c 20 46 49 4c 5f 51 55 45  ativeCp, FIL_QUE
6c20: 52 59 46 55 4c 4c 4e 41 4d 45 2c 20 7a 46 75 6c  RYFULLNAME, zFul
6c30: 6c 43 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  lCp,.           
6c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c50: 20 20 20 20 20 43 43 48 4d 41 58 50 41 54 48 20       CCHMAXPATH 
6c60: 29 3b 0a 20 20 66 72 65 65 28 20 7a 52 65 6c 61  );.  free( zRela
6c70: 74 69 76 65 43 70 20 29 3b 0a 20 20 7a 46 75 6c  tiveCp );.  zFul
6c80: 6c 55 54 46 20 3d 20 63 6f 6e 76 65 72 74 43 70  lUTF = convertCp
6c90: 50 61 74 68 54 6f 55 74 66 38 28 20 7a 46 75 6c  PathToUtf8( zFul
6ca0: 6c 43 70 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  lCp );.  sqlite3
6cb0: 5f 73 6e 70 72 69 6e 74 66 28 20 6e 46 75 6c 6c  _snprintf( nFull
6cc0: 2c 20 7a 46 75 6c 6c 2c 20 7a 46 75 6c 6c 55 54  , zFull, zFullUT
6cd0: 46 20 29 3b 0a 20 20 66 72 65 65 28 20 7a 46 75  F );.  free( zFu
6ce0: 6c 6c 55 54 46 20 29 3b 0a 20 20 72 65 74 75 72  llUTF );.  retur
6cf0: 6e 20 72 63 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52  n rc == NO_ERROR
6d00: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
6d10: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a 0a  QLITE_IOERR;.}..
6d20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6d30: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
6d40: 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  ON./*.** Interfa
6d50: 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20  ces for opening 
6d60: 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  a shared library
6d70: 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20  , finding entry 
6d80: 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e  points.** within
6d90: 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
6da0: 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67  ary, and closing
6db0: 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
6dc0: 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e  ary..*/./*.** In
6dd0: 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
6de0: 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
6df0: 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
6e00: 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
6e10: 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
6e20: 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
6e30: 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
6e40: 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61   library..*/.sta
6e50: 74 69 63 20 76 6f 69 64 20 2a 6f 73 32 44 6c 4f  tic void *os2DlO
6e60: 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20  pen(sqlite3_vfs 
6e70: 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61  *pVfs, const cha
6e80: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
6e90: 20 55 43 48 41 52 20 6c 6f 61 64 45 72 72 5b 32   UCHAR loadErr[2
6ea0: 35 36 5d 3b 0a 20 20 48 4d 4f 44 55 4c 45 20 68  56];.  HMODULE h
6eb0: 6d 6f 64 3b 0a 20 20 41 50 49 52 45 54 20 72 63  mod;.  APIRET rc
6ec0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  ;.  char *zFilen
6ed0: 61 6d 65 43 70 20 3d 20 63 6f 6e 76 65 72 74 55  ameCp = convertU
6ee0: 74 66 38 50 61 74 68 54 6f 43 70 28 7a 46 69 6c  tf8PathToCp(zFil
6ef0: 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20 44  ename);.  rc = D
6f00: 6f 73 4c 6f 61 64 4d 6f 64 75 6c 65 28 28 50 53  osLoadModule((PS
6f10: 5a 29 6c 6f 61 64 45 72 72 2c 20 73 69 7a 65 6f  Z)loadErr, sizeo
6f20: 66 28 6c 6f 61 64 45 72 72 29 2c 20 7a 46 69 6c  f(loadErr), zFil
6f30: 65 6e 61 6d 65 43 70 2c 20 26 68 6d 6f 64 29 3b  enameCp, &hmod);
6f40: 0a 20 20 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d  .  free(zFilenam
6f50: 65 43 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  eCp);.  return r
6f60: 63 20 21 3d 20 4e 4f 5f 45 52 52 4f 52 20 3f 20  c != NO_ERROR ? 
6f70: 30 20 3a 20 28 76 6f 69 64 2a 29 68 6d 6f 64 3b  0 : (void*)hmod;
6f80: 0a 7d 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f 2d 6f 70  .}./*.** A no-op
6f90: 20 73 69 6e 63 65 20 74 68 65 20 65 72 72 6f 72   since the error
6fa0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
6fb0: 64 20 6f 6e 20 74 68 65 20 44 6f 73 4c 6f 61 64  d on the DosLoad
6fc0: 4d 6f 64 75 6c 65 20 63 61 6c 6c 2e 0a 2a 2a 20  Module call..** 
6fd0: 6f 73 32 44 6c 6f 70 65 6e 20 72 65 74 75 72 6e  os2Dlopen return
6fe0: 73 20 7a 65 72 6f 20 69 66 20 44 6f 73 4c 6f 61  s zero if DosLoa
6ff0: 64 4d 6f 64 75 6c 65 20 69 73 20 6e 6f 74 20 73  dModule is not s
7000: 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74  uccessful..*/.st
7010: 61 74 69 63 20 76 6f 69 64 20 6f 73 32 44 6c 45  atic void os2DlE
7020: 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
7030: 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
7040: 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
7050: 7b 0a 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 7d 0a  {./* no-op */.}.
7060: 76 6f 69 64 20 2a 6f 73 32 44 6c 53 79 6d 28 73  void *os2DlSym(s
7070: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
7080: 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 2c  , void *pHandle,
7090: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79   const char *zSy
70a0: 6d 62 6f 6c 29 7b 0a 20 20 50 46 4e 20 70 66 6e  mbol){.  PFN pfn
70b0: 3b 0a 20 20 41 50 49 52 45 54 20 72 63 3b 0a 20  ;.  APIRET rc;. 
70c0: 20 72 63 20 3d 20 44 6f 73 51 75 65 72 79 50 72   rc = DosQueryPr
70d0: 6f 63 41 64 64 72 28 28 48 4d 4f 44 55 4c 45 29  ocAddr((HMODULE)
70e0: 70 48 61 6e 64 6c 65 2c 20 30 4c 2c 20 7a 53 79  pHandle, 0L, zSy
70f0: 6d 62 6f 6c 2c 20 26 70 66 6e 29 3b 0a 20 20 69  mbol, &pfn);.  i
7100: 66 28 20 72 63 20 21 3d 20 4e 4f 5f 45 52 52 4f  f( rc != NO_ERRO
7110: 52 20 29 7b 0a 20 20 20 20 2f 2a 20 69 66 20 74  R ){.    /* if t
7120: 68 65 20 73 79 6d 62 6f 6c 20 69 74 73 65 6c 66  he symbol itself
7130: 20 77 61 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20   was not found, 
7140: 73 65 61 72 63 68 20 61 67 61 69 6e 20 66 6f 72  search again for
7150: 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 2a   the same.     *
7160: 20 73 79 6d 62 6f 6c 20 77 69 74 68 20 61 6e 20   symbol with an 
7170: 65 78 74 72 61 20 75 6e 64 65 72 73 63 6f 72 65  extra underscore
7180: 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  , that might be 
7190: 6e 65 65 64 65 64 20 64 65 70 65 6e 64 69 6e 67  needed depending
71a0: 0a 20 20 20 20 20 2a 20 6f 6e 20 74 68 65 20 63  .     * on the c
71b0: 61 6c 6c 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  alling conventio
71c0: 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 5f 7a  n */.    char _z
71d0: 53 79 6d 62 6f 6c 5b 32 35 36 5d 20 3d 20 22 5f  Symbol[256] = "_
71e0: 22 3b 0a 20 20 20 20 73 74 72 6e 63 61 74 28 5f  ";.    strncat(_
71f0: 7a 53 79 6d 62 6f 6c 2c 20 7a 53 79 6d 62 6f 6c  zSymbol, zSymbol
7200: 2c 20 32 35 35 29 3b 0a 20 20 20 20 72 63 20 3d  , 255);.    rc =
7210: 20 44 6f 73 51 75 65 72 79 50 72 6f 63 41 64 64   DosQueryProcAdd
7220: 72 28 28 48 4d 4f 44 55 4c 45 29 70 48 61 6e 64  r((HMODULE)pHand
7230: 6c 65 2c 20 30 4c 2c 20 5f 7a 53 79 6d 62 6f 6c  le, 0L, _zSymbol
7240: 2c 20 26 70 66 6e 29 3b 0a 20 20 7d 0a 20 20 72  , &pfn);.  }.  r
7250: 65 74 75 72 6e 20 72 63 20 21 3d 20 4e 4f 5f 45  eturn rc != NO_E
7260: 52 52 4f 52 20 3f 20 30 20 3a 20 28 76 6f 69 64  RROR ? 0 : (void
7270: 2a 29 70 66 6e 3b 0a 7d 0a 76 6f 69 64 20 6f 73  *)pfn;.}.void os
7280: 32 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  2DlClose(sqlite3
7290: 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
72a0: 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 44 6f   *pHandle){.  Do
72b0: 73 46 72 65 65 4d 6f 64 75 6c 65 28 28 48 4d 4f  sFreeModule((HMO
72c0: 44 55 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 7d  DULE)pHandle);.}
72d0: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c  .#else /* if SQL
72e0: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
72f0: 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e  TENSION is defin
7300: 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ed: */.  #define
7310: 20 6f 73 32 44 6c 4f 70 65 6e 20 30 0a 20 20 23   os2DlOpen 0.  #
7320: 64 65 66 69 6e 65 20 6f 73 32 44 6c 45 72 72 6f  define os2DlErro
7330: 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 6f 73  r 0.  #define os
7340: 32 44 6c 53 79 6d 20 30 0a 20 20 23 64 65 66 69  2DlSym 0.  #defi
7350: 6e 65 20 6f 73 32 44 6c 43 6c 6f 73 65 20 30 0a  ne os2DlClose 0.
7360: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57  #endif.../*.** W
7370: 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75 66 20  rite up to nBuf 
7380: 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e  bytes of randomn
7390: 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a  ess into zBuf..*
73a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 32  /.static int os2
73b0: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
73c0: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
73d0: 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
73e0: 75 66 20 29 7b 0a 20 20 55 4c 4f 4e 47 20 73 69  uf ){.  ULONG si
73f0: 7a 65 6f 66 55 4c 6f 6e 67 20 3d 20 73 69 7a 65  zeofULong = size
7400: 6f 66 28 55 4c 4f 4e 47 29 3b 0a 20 20 69 6e 74  of(ULONG);.  int
7410: 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 69   n = 0;.  if( si
7420: 7a 65 6f 66 28 44 41 54 45 54 49 4d 45 29 20 3c  zeof(DATETIME) <
7430: 3d 20 6e 42 75 66 20 2d 20 6e 20 29 7b 0a 20 20  = nBuf - n ){.  
7440: 20 20 44 41 54 45 54 49 4d 45 20 78 3b 0a 20 20    DATETIME x;.  
7450: 20 20 44 6f 73 47 65 74 44 61 74 65 54 69 6d 65    DosGetDateTime
7460: 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  (&x);.    memcpy
7470: 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73  (&zBuf[n], &x, s
7480: 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e  izeof(x));.    n
7490: 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20   += sizeof(x);. 
74a0: 20 7d 0a 0a 20 20 69 66 28 20 73 69 7a 65 6f 66   }..  if( sizeof
74b0: 55 4c 6f 6e 67 20 3c 3d 20 6e 42 75 66 20 2d 20  ULong <= nBuf - 
74c0: 6e 20 29 7b 0a 20 20 20 20 50 50 49 42 20 70 70  n ){.    PPIB pp
74d0: 69 62 3b 0a 20 20 20 20 44 6f 73 47 65 74 49 6e  ib;.    DosGetIn
74e0: 66 6f 42 6c 6f 63 6b 73 28 4e 55 4c 4c 2c 20 26  foBlocks(NULL, &
74f0: 70 70 69 62 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ppib);.    memcp
7500: 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 70 69  y(&zBuf[n], &ppi
7510: 62 2d 3e 70 69 62 5f 75 6c 70 69 64 2c 20 73 69  b->pib_ulpid, si
7520: 7a 65 6f 66 55 4c 6f 6e 67 29 3b 0a 20 20 20 20  zeofULong);.    
7530: 6e 20 2b 3d 20 73 69 7a 65 6f 66 55 4c 6f 6e 67  n += sizeofULong
7540: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 69 7a  ;.  }..  if( siz
7550: 65 6f 66 55 4c 6f 6e 67 20 3c 3d 20 6e 42 75 66  eofULong <= nBuf
7560: 20 2d 20 6e 20 29 7b 0a 20 20 20 20 50 54 49 42   - n ){.    PTIB
7570: 20 70 74 69 62 3b 0a 20 20 20 20 44 6f 73 47 65   ptib;.    DosGe
7580: 74 49 6e 66 6f 42 6c 6f 63 6b 73 28 26 70 74 69  tInfoBlocks(&pti
7590: 62 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 6d 65  b, NULL);.    me
75a0: 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
75b0: 70 74 69 62 2d 3e 74 69 62 5f 70 74 69 62 32 2d  ptib->tib_ptib2-
75c0: 3e 74 69 62 32 5f 75 6c 74 69 64 2c 20 73 69 7a  >tib2_ultid, siz
75d0: 65 6f 66 55 4c 6f 6e 67 29 3b 0a 20 20 20 20 6e  eofULong);.    n
75e0: 20 2b 3d 20 73 69 7a 65 6f 66 55 4c 6f 6e 67 3b   += sizeofULong;
75f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 69 66 20 77 65  .  }..  /* if we
7600: 20 73 74 69 6c 6c 20 68 61 76 65 6e 27 74 20 66   still haven't f
7610: 69 6c 6c 65 64 20 74 68 65 20 62 75 66 66 65 72  illed the buffer
7620: 20 79 65 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69   yet the followi
7630: 6e 67 20 77 69 6c 6c 20 2a 2f 0a 20 20 2f 2a 20  ng will */.  /* 
7640: 67 72 61 62 20 65 76 65 72 79 74 68 69 6e 67 20  grab everything 
7650: 6f 6e 63 65 20 69 6e 73 74 65 61 64 20 6f 66 20  once instead of 
7660: 6d 61 6b 69 6e 67 20 73 65 76 65 72 61 6c 20 63  making several c
7670: 61 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  alls for a singl
7680: 65 20 69 74 65 6d 20 2a 2f 0a 20 20 69 66 28 20  e item */.  if( 
7690: 73 69 7a 65 6f 66 55 4c 6f 6e 67 20 3c 3d 20 6e  sizeofULong <= n
76a0: 42 75 66 20 2d 20 6e 20 29 7b 0a 20 20 20 20 55  Buf - n ){.    U
76b0: 4c 4f 4e 47 20 75 6c 53 79 73 49 6e 66 6f 5b 51  LONG ulSysInfo[Q
76c0: 53 56 5f 4d 41 58 5d 3b 0a 20 20 20 20 44 6f 73  SV_MAX];.    Dos
76d0: 51 75 65 72 79 53 79 73 49 6e 66 6f 28 31 4c 2c  QuerySysInfo(1L,
76e0: 20 51 53 56 5f 4d 41 58 2c 20 75 6c 53 79 73 49   QSV_MAX, ulSysI
76f0: 6e 66 6f 2c 20 73 69 7a 65 6f 66 55 4c 6f 6e 67  nfo, sizeofULong
7700: 20 2a 20 51 53 56 5f 4d 41 58 29 3b 0a 0a 20 20   * QSV_MAX);..  
7710: 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
7720: 5d 2c 20 26 75 6c 53 79 73 49 6e 66 6f 5b 51 53  ], &ulSysInfo[QS
7730: 56 5f 4d 53 5f 43 4f 55 4e 54 20 2d 20 31 5d 2c  V_MS_COUNT - 1],
7740: 20 73 69 7a 65 6f 66 55 4c 6f 6e 67 29 3b 0a 20   sizeofULong);. 
7750: 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 55 4c     n += sizeofUL
7760: 6f 6e 67 3b 0a 0a 20 20 20 20 69 66 28 20 73 69  ong;..    if( si
7770: 7a 65 6f 66 55 4c 6f 6e 67 20 3c 3d 20 6e 42 75  zeofULong <= nBu
7780: 66 20 2d 20 6e 20 29 7b 0a 20 20 20 20 20 20 6d  f - n ){.      m
7790: 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
77a0: 26 75 6c 53 79 73 49 6e 66 6f 5b 51 53 56 5f 54  &ulSysInfo[QSV_T
77b0: 49 4d 45 52 5f 49 4e 54 45 52 56 41 4c 20 2d 20  IMER_INTERVAL - 
77c0: 31 5d 2c 20 73 69 7a 65 6f 66 55 4c 6f 6e 67 29  1], sizeofULong)
77d0: 3b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ;.      n += siz
77e0: 65 6f 66 55 4c 6f 6e 67 3b 0a 20 20 20 20 7d 0a  eofULong;.    }.
77f0: 20 20 20 20 69 66 28 20 73 69 7a 65 6f 66 55 4c      if( sizeofUL
7800: 6f 6e 67 20 3c 3d 20 6e 42 75 66 20 2d 20 6e 20  ong <= nBuf - n 
7810: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
7820: 26 7a 42 75 66 5b 6e 5d 2c 20 26 75 6c 53 79 73  &zBuf[n], &ulSys
7830: 49 6e 66 6f 5b 51 53 56 5f 54 49 4d 45 5f 4c 4f  Info[QSV_TIME_LO
7840: 57 20 2d 20 31 5d 2c 20 73 69 7a 65 6f 66 55 4c  W - 1], sizeofUL
7850: 6f 6e 67 29 3b 0a 20 20 20 20 20 20 6e 20 2b 3d  ong);.      n +=
7860: 20 73 69 7a 65 6f 66 55 4c 6f 6e 67 3b 0a 20 20   sizeofULong;.  
7870: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 69 7a 65    }.    if( size
7880: 6f 66 55 4c 6f 6e 67 20 3c 3d 20 6e 42 75 66 20  ofULong <= nBuf 
7890: 2d 20 6e 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  - n ){.      mem
78a0: 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 75  cpy(&zBuf[n], &u
78b0: 6c 53 79 73 49 6e 66 6f 5b 51 53 56 5f 54 49 4d  lSysInfo[QSV_TIM
78c0: 45 5f 48 49 47 48 20 2d 20 31 5d 2c 20 73 69 7a  E_HIGH - 1], siz
78d0: 65 6f 66 55 4c 6f 6e 67 29 3b 0a 20 20 20 20 20  eofULong);.     
78e0: 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 55 4c 6f 6e   n += sizeofULon
78f0: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
7900: 20 73 69 7a 65 6f 66 55 4c 6f 6e 67 20 3c 3d 20   sizeofULong <= 
7910: 6e 42 75 66 20 2d 20 6e 20 29 7b 0a 20 20 20 20  nBuf - n ){.    
7920: 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
7930: 5d 2c 20 26 75 6c 53 79 73 49 6e 66 6f 5b 51 53  ], &ulSysInfo[QS
7940: 56 5f 54 4f 54 41 56 41 49 4c 4d 45 4d 20 2d 20  V_TOTAVAILMEM - 
7950: 31 5d 2c 20 73 69 7a 65 6f 66 55 4c 6f 6e 67 29  1], sizeofULong)
7960: 3b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ;.      n += siz
7970: 65 6f 66 55 4c 6f 6e 67 3b 0a 20 20 20 20 7d 0a  eofULong;.    }.
7980: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 3b    }..  return n;
7990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  .}../*.** Sleep 
79a0: 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
79b0: 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
79c0: 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
79d0: 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67  lept..** The arg
79e0: 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d  ument is the num
79f0: 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
7a00: 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73  nds we want to s
7a10: 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74  leep..** The ret
7a20: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
7a30: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
7a40: 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70  seconds of sleep
7a50: 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71   actually.** req
7a60: 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20  uested from the 
7a70: 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61  underlying opera
7a80: 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e  ting system, a n
7a90: 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d  umber which.** m
7aa0: 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20  ight be greater 
7ab0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
7ac0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62   the argument, b
7ad0: 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74  ut not less.** t
7ae0: 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74  han the argument
7af0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7b00: 6f 73 32 53 6c 65 65 70 28 20 73 71 6c 69 74 65  os2Sleep( sqlite
7b10: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
7b20: 20 6d 69 63 72 6f 73 65 63 20 29 7b 0a 20 20 44   microsec ){.  D
7b30: 6f 73 53 6c 65 65 70 28 20 28 6d 69 63 72 6f 73  osSleep( (micros
7b40: 65 63 2f 31 30 30 30 29 20 29 3b 0a 20 20 72 65  ec/1000) );.  re
7b50: 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 3b 0a 7d  turn microsec;.}
7b60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
7b70: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20  owing variable, 
7b80: 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d  if set to a non-
7b90: 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62 65 63 6f  zero value, beco
7ba0: 6d 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  mes the result.*
7bb0: 2a 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  * returned from 
7bc0: 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
7bd0: 54 69 6d 65 28 29 2e 20 20 54 68 69 73 20 69 73  Time().  This is
7be0: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
7bf0: 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
7c00: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
7c10: 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
7c20: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  e = 0;.#endif../
7c30: 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
7c40: 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
7c50: 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
7c60: 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
7c70: 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
7c80: 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
7c90: 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
7ca0: 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
7cb0: 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
7cc0: 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
7cd0: 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
7ce0: 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
7cf0: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 6f 73 32 43 75  nd..*/.int os2Cu
7d00: 72 72 65 6e 74 54 69 6d 65 28 20 73 71 6c 69 74  rrentTime( sqlit
7d10: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f  e3_vfs *pVfs, do
7d20: 75 62 6c 65 20 2a 70 72 4e 6f 77 20 29 7b 0a 20  uble *prNow ){. 
7d30: 20 64 6f 75 62 6c 65 20 6e 6f 77 3b 0a 20 20 53   double now;.  S
7d40: 48 4f 52 54 20 6d 69 6e 75 74 65 3b 20 2f 2a 20  HORT minute; /* 
7d50: 6e 65 65 64 73 20 74 6f 20 62 65 20 61 62 6c 65  needs to be able
7d60: 20 74 6f 20 63 6f 70 65 20 77 69 74 68 20 6e 65   to cope with ne
7d70: 67 61 74 69 76 65 20 74 69 6d 65 7a 6f 6e 65 20  gative timezone 
7d80: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 55 53 48 4f  offset */.  USHO
7d90: 52 54 20 73 65 63 6f 6e 64 2c 20 68 6f 75 72 2c  RT second, hour,
7da0: 0a 20 20 20 20 20 20 20 20 20 64 61 79 2c 20 6d  .         day, m
7db0: 6f 6e 74 68 2c 20 79 65 61 72 3b 0a 20 20 44 41  onth, year;.  DA
7dc0: 54 45 54 49 4d 45 20 64 74 3b 0a 20 20 44 6f 73  TETIME dt;.  Dos
7dd0: 47 65 74 44 61 74 65 54 69 6d 65 28 20 26 64 74  GetDateTime( &dt
7de0: 20 29 3b 0a 20 20 73 65 63 6f 6e 64 20 3d 20 28   );.  second = (
7df0: 55 53 48 4f 52 54 29 64 74 2e 73 65 63 6f 6e 64  USHORT)dt.second
7e00: 73 3b 0a 20 20 6d 69 6e 75 74 65 20 3d 20 28 53  s;.  minute = (S
7e10: 48 4f 52 54 29 64 74 2e 6d 69 6e 75 74 65 73 20  HORT)dt.minutes 
7e20: 2b 20 64 74 2e 74 69 6d 65 7a 6f 6e 65 3b 0a 20  + dt.timezone;. 
7e30: 20 68 6f 75 72 20 3d 20 28 55 53 48 4f 52 54 29   hour = (USHORT)
7e40: 64 74 2e 68 6f 75 72 73 3b 0a 20 20 64 61 79 20  dt.hours;.  day 
7e50: 3d 20 28 55 53 48 4f 52 54 29 64 74 2e 64 61 79  = (USHORT)dt.day
7e60: 3b 0a 20 20 6d 6f 6e 74 68 20 3d 20 28 55 53 48  ;.  month = (USH
7e70: 4f 52 54 29 64 74 2e 6d 6f 6e 74 68 3b 0a 20 20  ORT)dt.month;.  
7e80: 79 65 61 72 20 3d 20 28 55 53 48 4f 52 54 29 64  year = (USHORT)d
7e90: 74 2e 79 65 61 72 3b 0a 0a 20 20 2f 2a 20 43 61  t.year;..  /* Ca
7ea0: 6c 63 75 6c 61 74 69 6f 6e 73 20 66 72 6f 6d 20  lculations from 
7eb0: 68 74 74 70 3a 2f 2f 77 77 77 2e 61 73 74 72 6f  http://www.astro
7ec0: 2e 6b 65 65 6c 65 2e 61 63 2e 75 6b 2f 7e 72 6e  .keele.ac.uk/~rn
7ed0: 6f 2f 41 73 74 72 6f 6e 6f 6d 79 2f 68 6a 64 2e  o/Astronomy/hjd.
7ee0: 68 74 6d 6c 0a 20 20 20 20 20 68 74 74 70 3a 2f  html.     http:/
7ef0: 2f 77 77 77 2e 61 73 74 72 6f 2e 6b 65 65 6c 65  /www.astro.keele
7f00: 2e 61 63 2e 75 6b 2f 7e 72 6e 6f 2f 41 73 74 72  .ac.uk/~rno/Astr
7f10: 6f 6e 6f 6d 79 2f 68 6a 64 2d 30 2e 31 2e 63 20  onomy/hjd-0.1.c 
7f20: 2a 2f 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74  */.  /* Calculat
7f30: 65 20 74 68 65 20 4a 75 6c 69 61 6e 20 64 61 79  e the Julian day
7f40: 73 20 2a 2f 0a 20 20 6e 6f 77 20 3d 20 64 61 79  s */.  now = day
7f50: 20 2d 20 33 32 30 37 36 20 2b 0a 20 20 20 20 31   - 32076 +.    1
7f60: 34 36 31 2a 28 79 65 61 72 20 2b 20 34 38 30 30  461*(year + 4800
7f70: 20 2b 20 28 6d 6f 6e 74 68 20 2d 20 31 34 29 2f   + (month - 14)/
7f80: 31 32 29 2f 34 20 2b 0a 20 20 20 20 33 36 37 2a  12)/4 +.    367*
7f90: 28 6d 6f 6e 74 68 20 2d 20 32 20 2d 20 28 6d 6f  (month - 2 - (mo
7fa0: 6e 74 68 20 2d 20 31 34 29 2f 31 32 2a 31 32 29  nth - 14)/12*12)
7fb0: 2f 31 32 20 2d 0a 20 20 20 20 33 2a 28 28 79 65  /12 -.    3*((ye
7fc0: 61 72 20 2b 20 34 39 30 30 20 2b 20 28 6d 6f 6e  ar + 4900 + (mon
7fd0: 74 68 20 2d 20 31 34 29 2f 31 32 29 2f 31 30 30  th - 14)/12)/100
7fe0: 29 2f 34 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74  )/4;..  /* Add t
7ff0: 68 65 20 66 72 61 63 74 69 6f 6e 61 6c 20 68 6f  he fractional ho
8000: 75 72 73 2c 20 6d 69 6e 73 20 61 6e 64 20 73 65  urs, mins and se
8010: 63 6f 6e 64 73 20 2a 2f 0a 20 20 6e 6f 77 20 2b  conds */.  now +
8020: 3d 20 28 68 6f 75 72 20 2b 20 31 32 2e 30 29 2f  = (hour + 12.0)/
8030: 32 34 2e 30 3b 0a 20 20 6e 6f 77 20 2b 3d 20 6d  24.0;.  now += m
8040: 69 6e 75 74 65 2f 31 34 34 30 2e 30 3b 0a 20 20  inute/1440.0;.  
8050: 6e 6f 77 20 2b 3d 20 73 65 63 6f 6e 64 2f 38 36  now += second/86
8060: 34 30 30 2e 30 3b 0a 20 20 2a 70 72 4e 6f 77 20  400.0;.  *prNow 
8070: 3d 20 6e 6f 77 3b 0a 23 69 66 64 65 66 20 53 51  = now;.#ifdef SQ
8080: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
8090: 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
80a0: 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e  time ){.    *prN
80b0: 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 75 72  ow = sqlite3_cur
80c0: 72 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e  rent_time/86400.
80d0: 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 20  0 + 2440587.5;. 
80e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
80f0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
8100: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
8110: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 44 65  to the sqlite3De
8120: 66 61 75 6c 74 56 66 73 20 73 74 72 75 63 74 75  faultVfs structu
8130: 72 65 2e 20 20 20 57 65 20 75 73 65 0a 2a 2a 20  re.   We use.** 
8140: 61 20 66 75 6e 63 74 69 6f 6e 20 72 61 74 68 65  a function rathe
8150: 72 20 74 68 61 6e 20 67 69 76 65 20 74 68 65 20  r than give the 
8160: 73 74 72 75 63 74 75 72 65 20 67 6c 6f 62 61 6c  structure global
8170: 20 73 63 6f 70 65 20 62 65 63 61 75 73 65 0a 2a   scope because.*
8180: 2a 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73  * some compilers
8190: 20 28 4d 53 56 43 29 20 64 6f 20 6e 6f 74 20 61   (MSVC) do not a
81a0: 6c 6c 6f 77 20 66 6f 72 77 61 72 64 20 64 65 63  llow forward dec
81b0: 6c 61 72 61 74 69 6f 6e 73 20 6f 66 0a 2a 2a 20  larations of.** 
81c0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 72 75  initialized stru
81d0: 63 74 75 72 65 73 2e 0a 2a 2f 0a 73 71 6c 69 74  ctures..*/.sqlit
81e0: 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 4f  e3_vfs *sqlite3O
81f0: 73 44 65 66 61 75 6c 74 56 66 73 28 76 6f 69 64  sDefaultVfs(void
8200: 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  ){.  static sqli
8210: 74 65 33 5f 76 66 73 20 6f 73 32 56 66 73 20 3d  te3_vfs os2Vfs =
8220: 20 7b 0a 20 20 20 20 31 2c 20 20 20 20 20 20 20   {.    1,       
8230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
8240: 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a  rsion */.    siz
8250: 65 6f 66 28 6f 73 32 46 69 6c 65 29 2c 20 20 20  eof(os2File),   
8260: 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20  /* szOsFile */. 
8270: 20 20 20 43 43 48 4d 41 58 50 41 54 48 2c 20 20     CCHMAXPATH,  
8280: 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e        /* mxPathn
8290: 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
82b0: 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 6f   pNext */.    "o
82c0: 73 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  s2",            
82d0: 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20   /* zName */.   
82e0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
82f0: 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20      /* pAppData 
8300: 2a 2f 0a 0a 20 20 20 20 6f 73 32 4f 70 65 6e 2c  */..    os2Open,
8310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
8320: 70 65 6e 20 2a 2f 0a 20 20 20 20 6f 73 32 44 65  pen */.    os2De
8330: 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  lete,         /*
8340: 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20   xDelete */.    
8350: 6f 73 32 41 63 63 65 73 73 2c 20 20 20 20 20 20  os2Access,      
8360: 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f     /* xAccess */
8370: 0a 20 20 20 20 6f 73 32 47 65 74 54 65 6d 70 6e  .    os2GetTempn
8380: 61 6d 65 2c 20 20 20 20 2f 2a 20 78 47 65 74 54  ame,    /* xGetT
8390: 65 6d 70 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6f  empname */.    o
83a0: 73 32 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  s2FullPathname, 
83b0: 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61    /* xFullPathna
83c0: 6d 65 20 2a 2f 0a 20 20 20 20 6f 73 32 44 6c 4f  me */.    os2DlO
83d0: 70 65 6e 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pen,         /* 
83e0: 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 6f  xDlOpen */.    o
83f0: 73 32 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  s2DlError,      
8400: 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
8410: 0a 20 20 20 20 6f 73 32 44 6c 53 79 6d 2c 20 20  .    os2DlSym,  
8420: 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
8430: 6d 20 2a 2f 0a 20 20 20 20 6f 73 32 44 6c 43 6c  m */.    os2DlCl
8440: 6f 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 78  ose,        /* x
8450: 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 6f  DlClose */.    o
8460: 73 32 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  s2Randomness,   
8470: 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
8480: 20 2a 2f 0a 20 20 20 20 6f 73 32 53 6c 65 65 70   */.    os2Sleep
8490: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53  ,          /* xS
84a0: 6c 65 65 70 20 2a 2f 0a 20 20 20 20 6f 73 32 43  leep */.    os2C
84b0: 75 72 72 65 6e 74 54 69 6d 65 20 20 20 20 20 2f  urrentTime     /
84c0: 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a  * xCurrentTime *
84d0: 2f 0a 20 20 7d 3b 0a 0a 20 20 72 65 74 75 72 6e  /.  };..  return
84e0: 20 26 6f 73 32 56 66 73 3b 0a 7d 0a 0a 23 65 6e   &os2Vfs;.}..#en
84f0: 64 69 66 20 2f 2a 20 4f 53 5f 4f 53 32 20 2a 2f  dif /* OS_OS2 */
8500: 0a                                               .