/ Hex Artifact Content
Login

Artifact c05024cd179603181cde66d0ff83ce81e146f6de:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 4a 61 6e 20 32  /*.** 2008 Jan 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 6d 6f 64 69 66 69 65  ode that modifie
01a0: 64 20 74 68 65 20 4f 53 20 6c 61 79 65 72 20 69  d the OS layer i
01b0: 6e 20 6f 72 64 65 72 20 74 6f 20 73 69 6d 75 6c  n order to simul
01c0: 61 74 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74  ate.** different
01d0: 20 64 65 76 69 63 65 20 74 79 70 65 73 20 28 62   device types (b
01e0: 79 20 6f 76 65 72 72 69 64 69 6e 67 20 74 68 65  y overriding the
01f0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f   return values o
0200: 66 20 74 68 65 20 0a 2a 2a 20 78 44 65 76 69 63  f the .** xDevic
0210: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
0220: 28 29 20 61 6e 64 20 78 53 65 63 74 6f 72 53 69  () and xSectorSi
0230: 7a 65 28 29 20 6d 65 74 68 6f 64 73 29 2e 0a 2a  ze() methods)..*
0240: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53  /.#if SQLITE_TES
0250: 54 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  T          /* Th
0260: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0270: 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79  for testing only
0280: 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73   */..#include "s
0290: 71 6c 69 74 65 33 2e 68 22 0a 23 69 6e 63 6c 75  qlite3.h".#inclu
02a0: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
02b0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
02c0: 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20  pathname length 
02d0: 73 75 70 70 6f 72 74 65 64 20 62 79 20 74 68 65  supported by the
02e0: 20 64 65 76 73 79 6d 20 62 61 63 6b 65 6e 64 2e   devsym backend.
02f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 45 56 53  .*/.#define DEVS
0300: 59 4d 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  YM_MAX_PATHNAME 
0310: 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20  512../*.** Name 
0320: 75 73 65 64 20 74 6f 20 69 64 65 6e 74 69 66 79  used to identify
0330: 20 74 68 69 73 20 56 46 53 2e 0a 2a 2f 0a 23 64   this VFS..*/.#d
0340: 65 66 69 6e 65 20 44 45 56 53 59 4d 5f 56 46 53  efine DEVSYM_VFS
0350: 5f 4e 41 4d 45 20 22 64 65 76 73 79 6d 22 0a 0a  _NAME "devsym"..
0360: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 64  typedef struct d
0370: 65 76 73 79 6d 5f 66 69 6c 65 20 64 65 76 73 79  evsym_file devsy
0380: 6d 5f 66 69 6c 65 3b 0a 73 74 72 75 63 74 20 64  m_file;.struct d
0390: 65 76 73 79 6d 5f 66 69 6c 65 20 7b 0a 20 20 73  evsym_file {.  s
03a0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 62 61 73 65  qlite3_file base
03b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
03c0: 20 2a 70 52 65 61 6c 3b 0a 7d 3b 0a 0a 2f 2a 0a   *pReal;.};../*.
03d0: 2a 2a 20 4d 65 74 68 6f 64 20 64 65 63 6c 61 72  ** Method declar
03e0: 61 74 69 6f 6e 73 20 66 6f 72 20 64 65 76 73 79  ations for devsy
03f0: 6d 5f 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  m_file..*/.stati
0400: 63 20 69 6e 74 20 64 65 76 73 79 6d 43 6c 6f 73  c int devsymClos
0410: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  e(sqlite3_file*)
0420: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 76  ;.static int dev
0430: 73 79 6d 52 65 61 64 28 73 71 6c 69 74 65 33 5f  symRead(sqlite3_
0440: 66 69 6c 65 2a 2c 20 76 6f 69 64 2a 2c 20 69 6e  file*, void*, in
0450: 74 20 69 41 6d 74 2c 20 73 71 6c 69 74 65 33 5f  t iAmt, sqlite3_
0460: 69 6e 74 36 34 20 69 4f 66 73 74 29 3b 0a 73 74  int64 iOfst);.st
0470: 61 74 69 63 20 69 6e 74 20 64 65 76 73 79 6d 57  atic int devsymW
0480: 72 69 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  rite(sqlite3_fil
0490: 65 2a 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  e*,const void*,i
04a0: 6e 74 20 69 41 6d 74 2c 20 73 71 6c 69 74 65 33  nt iAmt, sqlite3
04b0: 5f 69 6e 74 36 34 20 69 4f 66 73 74 29 3b 0a 73  _int64 iOfst);.s
04c0: 74 61 74 69 63 20 69 6e 74 20 64 65 76 73 79 6d  tatic int devsym
04d0: 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33  Truncate(sqlite3
04e0: 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f  _file*, sqlite3_
04f0: 69 6e 74 36 34 20 73 69 7a 65 29 3b 0a 73 74 61  int64 size);.sta
0500: 74 69 63 20 69 6e 74 20 64 65 76 73 79 6d 53 79  tic int devsymSy
0510: 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  nc(sqlite3_file*
0520: 2c 20 69 6e 74 20 66 6c 61 67 73 29 3b 0a 73 74  , int flags);.st
0530: 61 74 69 63 20 69 6e 74 20 64 65 76 73 79 6d 46  atic int devsymF
0540: 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
0550: 66 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69  file*, sqlite3_i
0560: 6e 74 36 34 20 2a 70 53 69 7a 65 29 3b 0a 73 74  nt64 *pSize);.st
0570: 61 74 69 63 20 69 6e 74 20 64 65 76 73 79 6d 4c  atic int devsymL
0580: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
0590: 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
05a0: 69 6e 74 20 64 65 76 73 79 6d 55 6e 6c 6f 63 6b  int devsymUnlock
05b0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
05c0: 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
05d0: 20 64 65 76 73 79 6d 43 68 65 63 6b 52 65 73 65   devsymCheckRese
05e0: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
05f0: 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 2a 29 3b 0a  _file*, int *);.
0600: 73 74 61 74 69 63 20 69 6e 74 20 64 65 76 73 79  static int devsy
0610: 6d 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  mFileControl(sql
0620: 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20  ite3_file*, int 
0630: 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 3b  op, void *pArg);
0640: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 76 73  .static int devs
0650: 79 6d 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  ymSectorSize(sql
0660: 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61  ite3_file*);.sta
0670: 74 69 63 20 69 6e 74 20 64 65 76 73 79 6d 44 65  tic int devsymDe
0680: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
0690: 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ics(sqlite3_file
06a0: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65 74 68 6f  *);../*.** Metho
06b0: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 66  d declarations f
06c0: 6f 72 20 64 65 76 73 79 6d 5f 76 66 73 2e 0a 2a  or devsym_vfs..*
06d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 76  /.static int dev
06e0: 73 79 6d 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  symOpen(sqlite3_
06f0: 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  vfs*, const char
0700: 20 2a 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   *, sqlite3_file
0710: 2a 2c 20 69 6e 74 20 2c 20 69 6e 74 20 2a 29 3b  *, int , int *);
0720: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 76 73  .static int devs
0730: 79 6d 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  ymDelete(sqlite3
0740: 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61  _vfs*, const cha
0750: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 73 79  r *zName, int sy
0760: 6e 63 44 69 72 29 3b 0a 73 74 61 74 69 63 20 69  ncDir);.static i
0770: 6e 74 20 64 65 76 73 79 6d 41 63 63 65 73 73 28  nt devsymAccess(
0780: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f  sqlite3_vfs*, co
0790: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
07a0: 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74 20   int flags, int 
07b0: 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 64  *);.static int d
07c0: 65 76 73 79 6d 46 75 6c 6c 50 61 74 68 6e 61 6d  evsymFullPathnam
07d0: 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20  e(sqlite3_vfs*, 
07e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
07f0: 65 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 7a 4f  e, int, char *zO
0800: 75 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ut);.#ifndef SQL
0810: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
0820: 54 45 4e 53 49 4f 4e 0a 73 74 61 74 69 63 20 76  TENSION.static v
0830: 6f 69 64 20 2a 64 65 76 73 79 6d 44 6c 4f 70 65  oid *devsymDlOpe
0840: 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20  n(sqlite3_vfs*, 
0850: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
0860: 65 6e 61 6d 65 29 3b 0a 73 74 61 74 69 63 20 76  ename);.static v
0870: 6f 69 64 20 64 65 76 73 79 6d 44 6c 45 72 72 6f  oid devsymDlErro
0880: 72 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20  r(sqlite3_vfs*, 
0890: 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72 20  int nByte, char 
08a0: 2a 7a 45 72 72 4d 73 67 29 3b 0a 73 74 61 74 69  *zErrMsg);.stati
08b0: 63 20 76 6f 69 64 20 28 2a 64 65 76 73 79 6d 44  c void (*devsymD
08c0: 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
08d0: 2a 2c 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20 63  *,void*, const c
08e0: 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 29 28 76  har *zSymbol))(v
08f0: 6f 69 64 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  oid);.static voi
0900: 64 20 64 65 76 73 79 6d 44 6c 43 6c 6f 73 65 28  d devsymDlClose(
0910: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 76 6f  sqlite3_vfs*, vo
0920: 69 64 2a 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  id*);.#endif /* 
0930: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
0940: 5f 45 58 54 45 4e 53 49 4f 4e 20 2a 2f 0a 73 74  _EXTENSION */.st
0950: 61 74 69 63 20 69 6e 74 20 64 65 76 73 79 6d 52  atic int devsymR
0960: 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
0970: 33 5f 76 66 73 2a 2c 20 69 6e 74 20 6e 42 79 74  3_vfs*, int nByt
0980: 65 2c 20 63 68 61 72 20 2a 7a 4f 75 74 29 3b 0a  e, char *zOut);.
0990: 73 74 61 74 69 63 20 69 6e 74 20 64 65 76 73 79  static int devsy
09a0: 6d 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76  mSleep(sqlite3_v
09b0: 66 73 2a 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  fs*, int microse
09c0: 63 6f 6e 64 73 29 3b 0a 73 74 61 74 69 63 20 69  conds);.static i
09d0: 6e 74 20 64 65 76 73 79 6d 43 75 72 72 65 6e 74  nt devsymCurrent
09e0: 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  Time(sqlite3_vfs
09f0: 2a 2c 20 64 6f 75 62 6c 65 2a 29 3b 0a 0a 73 74  *, double*);..st
0a00: 61 74 69 63 20 69 6e 74 20 64 65 76 73 79 6d 53  atic int devsymS
0a10: 68 6d 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  hmOpen(sqlite3_v
0a20: 66 73 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  fs *, const char
0a30: 20 2a 2c 20 73 71 6c 69 74 65 33 5f 73 68 6d 20   *, sqlite3_shm 
0a40: 2a 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  **);.static int 
0a50: 64 65 76 73 79 6d 53 68 6d 53 69 7a 65 28 73 71  devsymShmSize(sq
0a60: 6c 69 74 65 33 5f 73 68 6d 20 2a 2c 20 69 6e 74  lite3_shm *, int
0a70: 20 2c 20 69 6e 74 20 2a 29 3b 0a 73 74 61 74 69   , int *);.stati
0a80: 63 20 69 6e 74 20 64 65 76 73 79 6d 53 68 6d 47  c int devsymShmG
0a90: 65 74 28 73 71 6c 69 74 65 33 5f 73 68 6d 20 2a  et(sqlite3_shm *
0aa0: 2c 20 69 6e 74 20 2c 20 69 6e 74 20 2a 2c 20 76  , int , int *, v
0ab0: 6f 69 64 20 2a 2a 29 3b 0a 73 74 61 74 69 63 20  oid **);.static 
0ac0: 69 6e 74 20 64 65 76 73 79 6d 53 68 6d 52 65 6c  int devsymShmRel
0ad0: 65 61 73 65 28 73 71 6c 69 74 65 33 5f 73 68 6d  ease(sqlite3_shm
0ae0: 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20   *);.static int 
0af0: 64 65 76 73 79 6d 53 68 6d 4c 6f 63 6b 28 73 71  devsymShmLock(sq
0b00: 6c 69 74 65 33 5f 73 68 6d 20 2a 2c 20 69 6e 74  lite3_shm *, int
0b10: 20 2c 20 69 6e 74 20 2a 29 3b 0a 73 74 61 74 69   , int *);.stati
0b20: 63 20 69 6e 74 20 64 65 76 73 79 6d 53 68 6d 43  c int devsymShmC
0b30: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 73 68 6d  lose(sqlite3_shm
0b40: 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20   *);.static int 
0b50: 64 65 76 73 79 6d 53 68 6d 44 65 6c 65 74 65 28  devsymShmDelete(
0b60: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20 63  sqlite3_vfs *, c
0b70: 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 73  onst char *);..s
0b80: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66  tatic sqlite3_vf
0b90: 73 20 64 65 76 73 79 6d 5f 76 66 73 20 3d 20 7b  s devsym_vfs = {
0ba0: 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20  .  2,           
0bb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
0bc0: 72 73 69 6f 6e 20 2a 2f 0a 20 20 73 69 7a 65 6f  rsion */.  sizeo
0bd0: 66 28 64 65 76 73 79 6d 5f 66 69 6c 65 29 2c 20  f(devsym_file), 
0be0: 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65       /* szOsFile
0bf0: 20 2a 2f 0a 20 20 44 45 56 53 59 4d 5f 4d 41 58   */.  DEVSYM_MAX
0c00: 5f 50 41 54 48 4e 41 4d 45 2c 20 20 20 20 20 20  _PATHNAME,      
0c10: 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
0c20: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
0c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
0c40: 78 74 20 2a 2f 0a 20 20 44 45 56 53 59 4d 5f 56  xt */.  DEVSYM_V
0c50: 46 53 5f 4e 41 4d 45 2c 20 20 20 20 20 20 20 20  FS_NAME,        
0c60: 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20    /* zName */.  
0c70: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
0c80: 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
0c90: 74 61 20 2a 2f 0a 20 20 64 65 76 73 79 6d 4f 70  ta */.  devsymOp
0ca0: 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
0cb0: 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20    /* xOpen */.  
0cc0: 64 65 76 73 79 6d 44 65 6c 65 74 65 2c 20 20 20  devsymDelete,   
0cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
0ce0: 6c 65 74 65 20 2a 2f 0a 20 20 64 65 76 73 79 6d  lete */.  devsym
0cf0: 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
0d00: 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
0d10: 2f 0a 20 20 64 65 76 73 79 6d 46 75 6c 6c 50 61  /.  devsymFullPa
0d20: 74 68 6e 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a  thname,       /*
0d30: 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
0d40: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
0d50: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
0d60: 53 49 4f 4e 0a 20 20 64 65 76 73 79 6d 44 6c 4f  SION.  devsymDlO
0d70: 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
0d80: 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20   /* xDlOpen */. 
0d90: 20 64 65 76 73 79 6d 44 6c 45 72 72 6f 72 2c 20   devsymDlError, 
0da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
0db0: 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 64 65 76 73  lError */.  devs
0dc0: 79 6d 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20  ymDlSym,        
0dd0: 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20        /* xDlSym 
0de0: 2a 2f 0a 20 20 64 65 76 73 79 6d 44 6c 43 6c 6f  */.  devsymDlClo
0df0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  se,            /
0e00: 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 23 65  * xDlClose */.#e
0e10: 6c 73 65 0a 20 20 30 2c 20 20 20 20 20 20 20 20  lse.  0,        
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e30: 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
0e40: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
0e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
0e60: 45 72 72 6f 72 20 2a 2f 0a 20 20 30 2c 20 20 20  Error */.  0,   
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e80: 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
0e90: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0eb0: 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 23 65 6e   xDlClose */.#en
0ec0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
0ed0: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
0ee0: 4e 20 2a 2f 0a 20 20 64 65 76 73 79 6d 52 61 6e  N */.  devsymRan
0ef0: 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 20  domness,        
0f00: 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20   /* xRandomness 
0f10: 2a 2f 0a 20 20 64 65 76 73 79 6d 53 6c 65 65 70  */.  devsymSleep
0f20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
0f30: 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 64 65  * xSleep */.  de
0f40: 76 73 79 6d 43 75 72 72 65 6e 74 54 69 6d 65 2c  vsymCurrentTime,
0f50: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72          /* xCurr
0f60: 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 30 2c 20  entTime */.  0, 
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f80: 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61         /* xGetLa
0f90: 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 64 65 76  stError */.  dev
0fa0: 73 79 6d 53 68 6d 4f 70 65 6e 2c 0a 20 20 64 65  symShmOpen,.  de
0fb0: 76 73 79 6d 53 68 6d 53 69 7a 65 2c 0a 20 20 64  vsymShmSize,.  d
0fc0: 65 76 73 79 6d 53 68 6d 47 65 74 2c 0a 20 20 64  evsymShmGet,.  d
0fd0: 65 76 73 79 6d 53 68 6d 52 65 6c 65 61 73 65 2c  evsymShmRelease,
0fe0: 0a 20 20 30 2c 0a 20 20 30 2c 0a 20 20 64 65 76  .  0,.  0,.  dev
0ff0: 73 79 6d 53 68 6d 4c 6f 63 6b 2c 0a 20 20 64 65  symShmLock,.  de
1000: 76 73 79 6d 53 68 6d 43 6c 6f 73 65 2c 0a 20 20  vsymShmClose,.  
1010: 64 65 76 73 79 6d 53 68 6d 44 65 6c 65 74 65 2c  devsymShmDelete,
1020: 0a 20 20 30 2c 0a 20 20 30 2c 0a 7d 3b 0a 0a 73  .  0,.  0,.};..s
1030: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6f  tatic sqlite3_io
1040: 5f 6d 65 74 68 6f 64 73 20 64 65 76 73 79 6d 5f  _methods devsym_
1050: 69 6f 5f 6d 65 74 68 6f 64 73 20 3d 20 7b 0a 20  io_methods = {. 
1060: 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1080: 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
1090: 64 65 76 73 79 6d 43 6c 6f 73 65 2c 20 20 20 20  devsymClose,    
10a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b0: 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20    /* xClose */. 
10c0: 20 64 65 76 73 79 6d 52 65 61 64 2c 20 20 20 20   devsymRead,    
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e0: 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20     /* xRead */. 
10f0: 20 64 65 76 73 79 6d 57 72 69 74 65 2c 20 20 20   devsymWrite,   
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1110: 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a     /* xWrite */.
1120: 20 20 64 65 76 73 79 6d 54 72 75 6e 63 61 74 65    devsymTruncate
1130: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1140: 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
1150: 20 2a 2f 0a 20 20 64 65 76 73 79 6d 53 79 6e 63   */.  devsymSync
1160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1170: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
1180: 20 2a 2f 0a 20 20 64 65 76 73 79 6d 46 69 6c 65   */.  devsymFile
1190: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
11a0: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
11b0: 53 69 7a 65 20 2a 2f 0a 20 20 64 65 76 73 79 6d  Size */.  devsym
11c0: 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
11e0: 4c 6f 63 6b 20 2a 2f 0a 20 20 64 65 76 73 79 6d  Lock */.  devsym
11f0: 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
1200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1210: 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 64 65 76 73  Unlock */.  devs
1220: 79 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ymCheckReservedL
1230: 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ock,          /*
1240: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
1250: 6f 63 6b 20 2a 2f 0a 20 20 64 65 76 73 79 6d 46  ock */.  devsymF
1260: 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20  ileControl,     
1270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
1280: 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20  ileControl */.  
1290: 64 65 76 73 79 6d 53 65 63 74 6f 72 53 69 7a 65  devsymSectorSize
12a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12b0: 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
12c0: 20 2a 2f 0a 20 20 64 65 76 73 79 6d 44 65 76 69   */.  devsymDevi
12d0: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
12e0: 73 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69  s       /* xDevi
12f0: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1300: 73 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  s */.};..struct 
1310: 44 65 76 73 79 6d 47 6c 6f 62 61 6c 20 7b 0a 20  DevsymGlobal {. 
1320: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1330: 66 73 3b 0a 20 20 69 6e 74 20 69 44 65 76 69 63  fs;.  int iDevic
1340: 65 43 68 61 72 3b 0a 20 20 69 6e 74 20 69 53 65  eChar;.  int iSe
1350: 63 74 6f 72 53 69 7a 65 3b 0a 7d 3b 0a 73 74 72  ctorSize;.};.str
1360: 75 63 74 20 44 65 76 73 79 6d 47 6c 6f 62 61 6c  uct DevsymGlobal
1370: 20 67 20 3d 20 7b 30 2c 20 30 2c 20 35 31 32 7d   g = {0, 0, 512}
1380: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  ;../*.** Close a
1390: 6e 20 64 65 76 73 79 6d 2d 66 69 6c 65 2e 0a 2a  n devsym-file..*
13a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 76  /.static int dev
13b0: 73 79 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  symClose(sqlite3
13c0: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
13d0: 20 64 65 76 73 79 6d 5f 66 69 6c 65 20 2a 70 20   devsym_file *p 
13e0: 3d 20 28 64 65 76 73 79 6d 5f 66 69 6c 65 20 2a  = (devsym_file *
13f0: 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e  )pFile;.  return
1400: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
1410: 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a  p->pReal);.}../*
1420: 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
1430: 6f 6d 20 61 6e 20 64 65 76 73 79 6d 2d 66 69 6c  om an devsym-fil
1440: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1450: 20 64 65 76 73 79 6d 52 65 61 64 28 0a 20 20 73   devsymRead(.  s
1460: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
1470: 6c 65 2c 20 0a 20 20 76 6f 69 64 20 2a 7a 42 75  le, .  void *zBu
1480: 66 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74 2c 20  f, .  int iAmt, 
1490: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
14a0: 69 4f 66 73 74 0a 29 7b 0a 20 20 64 65 76 73 79  iOfst.){.  devsy
14b0: 6d 5f 66 69 6c 65 20 2a 70 20 3d 20 28 64 65 76  m_file *p = (dev
14c0: 73 79 6d 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  sym_file *)pFile
14d0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
14e0: 65 33 4f 73 52 65 61 64 28 70 2d 3e 70 52 65 61  e3OsRead(p->pRea
14f0: 6c 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69  l, zBuf, iAmt, i
1500: 4f 66 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Ofst);.}../*.** 
1510: 57 72 69 74 65 20 64 61 74 61 20 74 6f 20 61 6e  Write data to an
1520: 20 64 65 76 73 79 6d 2d 66 69 6c 65 2e 0a 2a 2f   devsym-file..*/
1530: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 76 73  .static int devs
1540: 79 6d 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74  ymWrite(.  sqlit
1550: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
1560: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1570: 42 75 66 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74  Buf, .  int iAmt
1580: 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  , .  sqlite_int6
1590: 34 20 69 4f 66 73 74 0a 29 7b 0a 20 20 64 65 76  4 iOfst.){.  dev
15a0: 73 79 6d 5f 66 69 6c 65 20 2a 70 20 3d 20 28 64  sym_file *p = (d
15b0: 65 76 73 79 6d 5f 66 69 6c 65 20 2a 29 70 46 69  evsym_file *)pFi
15c0: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  le;.  return sql
15d0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 2d 3e 70  ite3OsWrite(p->p
15e0: 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d 74  Real, zBuf, iAmt
15f0: 2c 20 69 4f 66 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , iOfst);.}../*.
1600: 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 64  ** Truncate an d
1610: 65 76 73 79 6d 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  evsym-file..*/.s
1620: 74 61 74 69 63 20 69 6e 74 20 64 65 76 73 79 6d  tatic int devsym
1630: 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33  Truncate(sqlite3
1640: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71  _file *pFile, sq
1650: 6c 69 74 65 5f 69 6e 74 36 34 20 73 69 7a 65 29  lite_int64 size)
1660: 7b 0a 20 20 64 65 76 73 79 6d 5f 66 69 6c 65 20  {.  devsym_file 
1670: 2a 70 20 3d 20 28 64 65 76 73 79 6d 5f 66 69 6c  *p = (devsym_fil
1680: 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74  e *)pFile;.  ret
1690: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 54 72 75  urn sqlite3OsTru
16a0: 6e 63 61 74 65 28 70 2d 3e 70 52 65 61 6c 2c 20  ncate(p->pReal, 
16b0: 73 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  size);.}../*.** 
16c0: 53 79 6e 63 20 61 6e 20 64 65 76 73 79 6d 2d 66  Sync an devsym-f
16d0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
16e0: 6e 74 20 64 65 76 73 79 6d 53 79 6e 63 28 73 71  nt devsymSync(sq
16f0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
1700: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
1710: 20 64 65 76 73 79 6d 5f 66 69 6c 65 20 2a 70 20   devsym_file *p 
1720: 3d 20 28 64 65 76 73 79 6d 5f 66 69 6c 65 20 2a  = (devsym_file *
1730: 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e  )pFile;.  return
1740: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
1750: 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73 29 3b  ->pReal, flags);
1760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1770: 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 69 6c   the current fil
1780: 65 2d 73 69 7a 65 20 6f 66 20 61 6e 20 64 65 76  e-size of an dev
1790: 73 79 6d 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  sym-file..*/.sta
17a0: 74 69 63 20 69 6e 74 20 64 65 76 73 79 6d 46 69  tic int devsymFi
17b0: 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
17c0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69  ile *pFile, sqli
17d0: 74 65 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29  te_int64 *pSize)
17e0: 7b 0a 20 20 64 65 76 73 79 6d 5f 66 69 6c 65 20  {.  devsym_file 
17f0: 2a 70 20 3d 20 28 64 65 76 73 79 6d 5f 66 69 6c  *p = (devsym_fil
1800: 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74  e *)pFile;.  ret
1810: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  urn sqlite3OsFil
1820: 65 53 69 7a 65 28 70 2d 3e 70 52 65 61 6c 2c 20  eSize(p->pReal, 
1830: 70 53 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pSize);.}../*.**
1840: 20 4c 6f 63 6b 20 61 6e 20 64 65 76 73 79 6d 2d   Lock an devsym-
1850: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1860: 69 6e 74 20 64 65 76 73 79 6d 4c 6f 63 6b 28 73  int devsymLock(s
1870: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
1880: 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  le, int eLock){.
1890: 20 20 64 65 76 73 79 6d 5f 66 69 6c 65 20 2a 70    devsym_file *p
18a0: 20 3d 20 28 64 65 76 73 79 6d 5f 66 69 6c 65 20   = (devsym_file 
18b0: 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72  *)pFile;.  retur
18c0: 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  n sqlite3OsLock(
18d0: 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f 63 6b 29  p->pReal, eLock)
18e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
18f0: 6b 20 61 6e 20 64 65 76 73 79 6d 2d 66 69 6c 65  k an devsym-file
1900: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1910: 64 65 76 73 79 6d 55 6e 6c 6f 63 6b 28 73 71 6c  devsymUnlock(sql
1920: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
1930: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
1940: 64 65 76 73 79 6d 5f 66 69 6c 65 20 2a 70 20 3d  devsym_file *p =
1950: 20 28 64 65 76 73 79 6d 5f 66 69 6c 65 20 2a 29   (devsym_file *)
1960: 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
1970: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
1980: 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f 63 6b 29  p->pReal, eLock)
1990: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
19a0: 20 69 66 20 61 6e 6f 74 68 65 72 20 66 69 6c 65   if another file
19b0: 2d 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61 20  -handle holds a 
19c0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
19d0: 20 61 6e 20 64 65 76 73 79 6d 2d 66 69 6c 65 2e   an devsym-file.
19e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
19f0: 65 76 73 79 6d 43 68 65 63 6b 52 65 73 65 72 76  evsymCheckReserv
1a00: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
1a10: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
1a20: 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 64 65 76  *pResOut){.  dev
1a30: 73 79 6d 5f 66 69 6c 65 20 2a 70 20 3d 20 28 64  sym_file *p = (d
1a40: 65 76 73 79 6d 5f 66 69 6c 65 20 2a 29 70 46 69  evsym_file *)pFi
1a50: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  le;.  return sql
1a60: 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
1a70: 76 65 64 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c  vedLock(p->pReal
1a80: 2c 20 70 52 65 73 4f 75 74 29 3b 0a 7d 0a 0a 2f  , pResOut);.}../
1a90: 2a 0a 2a 2a 20 46 69 6c 65 20 63 6f 6e 74 72 6f  *.** File contro
1aa0: 6c 20 6d 65 74 68 6f 64 2e 20 46 6f 72 20 63 75  l method. For cu
1ab0: 73 74 6f 6d 20 6f 70 65 72 61 74 69 6f 6e 73 20  stom operations 
1ac0: 6f 6e 20 61 6e 20 64 65 76 73 79 6d 2d 66 69 6c  on an devsym-fil
1ad0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1ae0: 20 64 65 76 73 79 6d 46 69 6c 65 43 6f 6e 74 72   devsymFileContr
1af0: 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
1b00: 2a 70 46 69 6c 65 2c 20 69 6e 74 20 6f 70 2c 20  *pFile, int op, 
1b10: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 64  void *pArg){.  d
1b20: 65 76 73 79 6d 5f 66 69 6c 65 20 2a 70 20 3d 20  evsym_file *p = 
1b30: 28 64 65 76 73 79 6d 5f 66 69 6c 65 20 2a 29 70  (devsym_file *)p
1b40: 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 73  File;.  return s
1b50: 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
1b60: 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 6f 70  rol(p->pReal, op
1b70: 2c 20 70 41 72 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , pArg);.}../*.*
1b80: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63  * Return the sec
1b90: 74 6f 72 2d 73 69 7a 65 20 69 6e 20 62 79 74 65  tor-size in byte
1ba0: 73 20 66 6f 72 20 61 6e 20 64 65 76 73 79 6d 2d  s for an devsym-
1bb0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1bc0: 69 6e 74 20 64 65 76 73 79 6d 53 65 63 74 6f 72  int devsymSector
1bd0: 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
1be0: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72 65 74  e *pFile){.  ret
1bf0: 75 72 6e 20 67 2e 69 53 65 63 74 6f 72 53 69 7a  urn g.iSectorSiz
1c00: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
1c10: 72 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68  rn the device ch
1c20: 61 72 61 63 74 65 72 69 73 74 69 63 20 66 6c 61  aracteristic fla
1c30: 67 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  gs supported by 
1c40: 61 6e 20 64 65 76 73 79 6d 2d 66 69 6c 65 2e 0a  an devsym-file..
1c50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
1c60: 76 73 79 6d 44 65 76 69 63 65 43 68 61 72 61 63  vsymDeviceCharac
1c70: 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
1c80: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
1c90: 20 20 72 65 74 75 72 6e 20 67 2e 69 44 65 76 69    return g.iDevi
1ca0: 63 65 43 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ceChar;.}../*.**
1cb0: 20 4f 70 65 6e 20 61 6e 20 64 65 76 73 79 6d 20   Open an devsym 
1cc0: 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  file handle..*/.
1cd0: 73 74 61 74 69 63 20 69 6e 74 20 64 65 76 73 79  static int devsy
1ce0: 6d 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  mOpen(.  sqlite3
1cf0: 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f  _vfs *pVfs,.  co
1d00: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1d10: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1d20: 2a 70 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66 6c  *pFile,.  int fl
1d30: 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74  ags,.  int *pOut
1d40: 46 6c 61 67 73 0a 29 7b 0a 20 20 69 6e 74 20 72  Flags.){.  int r
1d50: 63 3b 0a 20 20 64 65 76 73 79 6d 5f 66 69 6c 65  c;.  devsym_file
1d60: 20 2a 70 20 3d 20 28 64 65 76 73 79 6d 5f 66 69   *p = (devsym_fi
1d70: 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 70 2d  le *)pFile;.  p-
1d80: 3e 70 52 65 61 6c 20 3d 20 28 73 71 6c 69 74 65  >pReal = (sqlite
1d90: 33 5f 66 69 6c 65 20 2a 29 26 70 5b 31 5d 3b 0a  3_file *)&p[1];.
1da0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1db0: 4f 70 65 6e 28 67 2e 70 56 66 73 2c 20 7a 4e 61  Open(g.pVfs, zNa
1dc0: 6d 65 2c 20 70 2d 3e 70 52 65 61 6c 2c 20 66 6c  me, p->pReal, fl
1dd0: 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b  ags, pOutFlags);
1de0: 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61 6c 2d  .  if( p->pReal-
1df0: 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
1e00: 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
1e10: 20 3d 20 26 64 65 76 73 79 6d 5f 69 6f 5f 6d 65   = &devsym_io_me
1e20: 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 72 65 74  thods;.  }.  ret
1e30: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1e40: 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   Delete the file
1e50: 20 6c 6f 63 61 74 65 64 20 61 74 20 7a 50 61 74   located at zPat
1e60: 68 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 6e  h. If the dirSyn
1e70: 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72  c argument is tr
1e80: 75 65 2c 0a 2a 2a 20 65 6e 73 75 72 65 20 74 68  ue,.** ensure th
1e90: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6d 6f  e file-system mo
1ea0: 64 69 66 69 63 61 74 69 6f 6e 73 20 61 72 65 20  difications are 
1eb0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 62  synced to disk b
1ec0: 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69  efore.** returni
1ed0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
1ee0: 74 20 64 65 76 73 79 6d 44 65 6c 65 74 65 28 73  t devsymDelete(s
1ef0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1f00: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
1f10: 61 74 68 2c 20 69 6e 74 20 64 69 72 53 79 6e 63  ath, int dirSync
1f20: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1f30: 74 65 33 4f 73 44 65 6c 65 74 65 28 67 2e 70 56  te3OsDelete(g.pV
1f40: 66 73 2c 20 7a 50 61 74 68 2c 20 64 69 72 53 79  fs, zPath, dirSy
1f50: 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65  nc);.}../*.** Te
1f60: 73 74 20 66 6f 72 20 61 63 63 65 73 73 20 70 65  st for access pe
1f70: 72 6d 69 73 73 69 6f 6e 73 2e 20 52 65 74 75 72  rmissions. Retur
1f80: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 72 65  n true if the re
1f90: 71 75 65 73 74 65 64 20 70 65 72 6d 69 73 73 69  quested permissi
1fa0: 6f 6e 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  on.** is availab
1fb0: 6c 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  le, or false oth
1fc0: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
1fd0: 63 20 69 6e 74 20 64 65 76 73 79 6d 41 63 63 65  c int devsymAcce
1fe0: 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
1ff0: 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73  s *pVfs, .  cons
2000: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a  t char *zPath, .
2010: 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 0a 20 20    int flags, .  
2020: 69 6e 74 20 2a 70 52 65 73 4f 75 74 0a 29 7b 0a  int *pResOut.){.
2030: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2040: 4f 73 41 63 63 65 73 73 28 67 2e 70 56 66 73 2c  OsAccess(g.pVfs,
2050: 20 7a 50 61 74 68 2c 20 66 6c 61 67 73 2c 20 70   zPath, flags, p
2060: 52 65 73 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ResOut);.}../*.*
2070: 2a 20 50 6f 70 75 6c 61 74 65 20 62 75 66 66 65  * Populate buffe
2080: 72 20 7a 4f 75 74 20 77 69 74 68 20 74 68 65 20  r zOut with the 
2090: 66 75 6c 6c 20 63 61 6e 6f 6e 69 63 61 6c 20 70  full canonical p
20a0: 61 74 68 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f  athname correspo
20b0: 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20  nding.** to the 
20c0: 70 61 74 68 6e 61 6d 65 20 69 6e 20 7a 50 61 74  pathname in zPat
20d0: 68 2e 20 7a 4f 75 74 20 69 73 20 67 75 61 72 61  h. zOut is guara
20e0: 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  nteed to point t
20f0: 6f 20 61 20 62 75 66 66 65 72 0a 2a 2a 20 6f 66  o a buffer.** of
2100: 20 61 74 20 6c 65 61 73 74 20 28 44 45 56 53 59   at least (DEVSY
2110: 4d 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  M_MAX_PATHNAME+1
2120: 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  ) bytes..*/.stat
2130: 69 63 20 69 6e 74 20 64 65 76 73 79 6d 46 75 6c  ic int devsymFul
2140: 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c  lPathname(.  sql
2150: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2160: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2170: 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 6e 4f 75  Path, .  int nOu
2180: 74 2c 20 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74  t, .  char *zOut
2190: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .){.  return sql
21a0: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
21b0: 6d 65 28 67 2e 70 56 66 73 2c 20 7a 50 61 74 68  me(g.pVfs, zPath
21c0: 2c 20 6e 4f 75 74 2c 20 7a 4f 75 74 29 3b 0a 7d  , nOut, zOut);.}
21d0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
21e0: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
21f0: 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  SION./*.** Open 
2200: 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72  the dynamic libr
2210: 61 72 79 20 6c 6f 63 61 74 65 64 20 61 74 20 7a  ary located at z
2220: 50 61 74 68 20 61 6e 64 20 72 65 74 75 72 6e 20  Path and return 
2230: 61 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  a handle..*/.sta
2240: 74 69 63 20 76 6f 69 64 20 2a 64 65 76 73 79 6d  tic void *devsym
2250: 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
2260: 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20  fs *pVfs, const 
2270: 63 68 61 72 20 2a 7a 50 61 74 68 29 7b 0a 20 20  char *zPath){.  
2280: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
2290: 44 6c 4f 70 65 6e 28 67 2e 70 56 66 73 2c 20 7a  DlOpen(g.pVfs, z
22a0: 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Path);.}../*.** 
22b0: 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75 66  Populate the buf
22c0: 66 65 72 20 7a 45 72 72 4d 73 67 20 28 73 69 7a  fer zErrMsg (siz
22d0: 65 20 6e 42 79 74 65 20 62 79 74 65 73 29 20 77  e nByte bytes) w
22e0: 69 74 68 20 61 20 68 75 6d 61 6e 20 72 65 61 64  ith a human read
22f0: 61 62 6c 65 0a 2a 2a 20 75 74 66 2d 38 20 73 74  able.** utf-8 st
2300: 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20  ring describing 
2310: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
2320: 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
2330: 64 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a  d associated .**
2340: 20 77 69 74 68 20 64 79 6e 61 6d 69 63 20 6c 69   with dynamic li
2350: 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  braries..*/.stat
2360: 69 63 20 76 6f 69 64 20 64 65 76 73 79 6d 44 6c  ic void devsymDl
2370: 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
2380: 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79  s *pVfs, int nBy
2390: 74 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  te, char *zErrMs
23a0: 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 4f 73 44  g){.  sqlite3OsD
23b0: 6c 45 72 72 6f 72 28 67 2e 70 56 66 73 2c 20 6e  lError(g.pVfs, n
23c0: 42 79 74 65 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  Byte, zErrMsg);.
23d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
23e0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
23f0: 20 73 79 6d 62 6f 6c 20 7a 53 79 6d 62 6f 6c 20   symbol zSymbol 
2400: 69 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c  in the dynamic l
2410: 69 62 72 61 72 79 20 70 48 61 6e 64 6c 65 2e 0a  ibrary pHandle..
2420: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28  */.static void (
2430: 2a 64 65 76 73 79 6d 44 6c 53 79 6d 28 73 71 6c  *devsymDlSym(sql
2440: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2450: 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63  void *p, const c
2460: 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64  har *zSym))(void
2470: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
2480: 74 65 33 4f 73 44 6c 53 79 6d 28 67 2e 70 56 66  te3OsDlSym(g.pVf
2490: 73 2c 20 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 0a  s, p, zSym);.}..
24a0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20  /*.** Close the 
24b0: 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20  dynamic library 
24c0: 68 61 6e 64 6c 65 20 70 48 61 6e 64 6c 65 2e 0a  handle pHandle..
24d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
24e0: 65 76 73 79 6d 44 6c 43 6c 6f 73 65 28 73 71 6c  evsymDlClose(sql
24f0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2500: 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
2510: 20 20 73 71 6c 69 74 65 33 4f 73 44 6c 43 6c 6f    sqlite3OsDlClo
2520: 73 65 28 67 2e 70 56 66 73 2c 20 70 48 61 6e 64  se(g.pVfs, pHand
2530: 6c 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  le);.}.#endif /*
2540: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
2550: 44 5f 45 58 54 45 4e 53 49 4f 4e 20 2a 2f 0a 0a  D_EXTENSION */..
2560: 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74  /*.** Populate t
2570: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
2580: 64 20 74 6f 20 62 79 20 7a 42 75 66 4f 75 74 20  d to by zBufOut 
2590: 77 69 74 68 20 6e 42 79 74 65 20 62 79 74 65 73  with nByte bytes
25a0: 20 6f 66 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 64   of .** random d
25b0: 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ata..*/.static i
25c0: 6e 74 20 64 65 76 73 79 6d 52 61 6e 64 6f 6d 6e  nt devsymRandomn
25d0: 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ess(sqlite3_vfs 
25e0: 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65  *pVfs, int nByte
25f0: 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
2600: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
2610: 65 33 4f 73 52 61 6e 64 6f 6d 6e 65 73 73 28 67  e3OsRandomness(g
2620: 2e 70 56 66 73 2c 20 6e 42 79 74 65 2c 20 7a 42  .pVfs, nByte, zB
2630: 75 66 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ufOut);.}../*.**
2640: 20 53 6c 65 65 70 20 66 6f 72 20 6e 4d 69 63 72   Sleep for nMicr
2650: 6f 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20  o microseconds. 
2660: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
2670: 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
2680: 73 20 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 73  s .** actually s
2690: 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lept..*/.static 
26a0: 69 6e 74 20 64 65 76 73 79 6d 53 6c 65 65 70 28  int devsymSleep(
26b0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
26c0: 73 2c 20 69 6e 74 20 6e 4d 69 63 72 6f 29 7b 0a  s, int nMicro){.
26d0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
26e0: 4f 73 53 6c 65 65 70 28 67 2e 70 56 66 73 2c 20  OsSleep(g.pVfs, 
26f0: 6e 4d 69 63 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  nMicro);.}../*.*
2700: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
2710: 72 65 6e 74 20 74 69 6d 65 20 61 73 20 61 20 4a  rent time as a J
2720: 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
2730: 20 69 6e 20 2a 70 54 69 6d 65 4f 75 74 2e 0a 2a   in *pTimeOut..*
2740: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 76  /.static int dev
2750: 73 79 6d 43 75 72 72 65 6e 74 54 69 6d 65 28 73  symCurrentTime(s
2760: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2770: 2c 20 64 6f 75 62 6c 65 20 2a 70 54 69 6d 65 4f  , double *pTimeO
2780: 75 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  ut){.  return sq
2790: 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69  lite3OsCurrentTi
27a0: 6d 65 28 67 2e 70 56 66 73 2c 20 70 54 69 6d 65  me(g.pVfs, pTime
27b0: 4f 75 74 29 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63  Out);.}...static
27c0: 20 69 6e 74 20 64 65 76 73 79 6d 53 68 6d 4f 70   int devsymShmOp
27d0: 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
27e0: 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73  s *pVfs, .  cons
27f0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
2800: 20 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 2a 2a    sqlite3_shm **
2810: 70 70 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 67  pp.){.  return g
2820: 2e 70 56 66 73 2d 3e 78 53 68 6d 4f 70 65 6e 28  .pVfs->xShmOpen(
2830: 67 2e 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 70  g.pVfs, zName, p
2840: 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  p);.}.static int
2850: 20 64 65 76 73 79 6d 53 68 6d 53 69 7a 65 28 73   devsymShmSize(s
2860: 71 6c 69 74 65 33 5f 73 68 6d 20 2a 70 2c 20 69  qlite3_shm *p, i
2870: 6e 74 20 72 65 71 53 69 7a 65 2c 20 69 6e 74 20  nt reqSize, int 
2880: 2a 70 4e 65 77 53 69 7a 65 29 7b 0a 20 20 72 65  *pNewSize){.  re
2890: 74 75 72 6e 20 67 2e 70 56 66 73 2d 3e 78 53 68  turn g.pVfs->xSh
28a0: 6d 53 69 7a 65 28 70 2c 20 72 65 71 53 69 7a 65  mSize(p, reqSize
28b0: 2c 20 70 4e 65 77 53 69 7a 65 29 3b 0a 7d 0a 73  , pNewSize);.}.s
28c0: 74 61 74 69 63 20 69 6e 74 20 64 65 76 73 79 6d  tatic int devsym
28d0: 53 68 6d 47 65 74 28 0a 20 20 73 71 6c 69 74 65  ShmGet(.  sqlite
28e0: 33 5f 73 68 6d 20 2a 70 2c 20 0a 20 20 69 6e 74  3_shm *p, .  int
28f0: 20 72 65 71 4d 61 70 53 69 7a 65 2c 20 0a 20 20   reqMapSize, .  
2900: 69 6e 74 20 2a 70 4d 61 70 53 69 7a 65 2c 20 0a  int *pMapSize, .
2910: 20 20 76 6f 69 64 20 2a 2a 70 70 0a 29 7b 0a 20    void **pp.){. 
2920: 20 72 65 74 75 72 6e 20 67 2e 70 56 66 73 2d 3e   return g.pVfs->
2930: 78 53 68 6d 47 65 74 28 70 2c 20 72 65 71 4d 61  xShmGet(p, reqMa
2940: 70 53 69 7a 65 2c 20 70 4d 61 70 53 69 7a 65 2c  pSize, pMapSize,
2950: 20 70 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69   pp);.}.static i
2960: 6e 74 20 64 65 76 73 79 6d 53 68 6d 52 65 6c 65  nt devsymShmRele
2970: 61 73 65 28 73 71 6c 69 74 65 33 5f 73 68 6d 20  ase(sqlite3_shm 
2980: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 2e  *p){.  return g.
2990: 70 56 66 73 2d 3e 78 53 68 6d 52 65 6c 65 61 73  pVfs->xShmReleas
29a0: 65 28 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  e(p);.}.static i
29b0: 6e 74 20 64 65 76 73 79 6d 53 68 6d 4c 6f 63 6b  nt devsymShmLock
29c0: 28 73 71 6c 69 74 65 33 5f 73 68 6d 20 2a 70 2c  (sqlite3_shm *p,
29d0: 20 69 6e 74 20 64 65 73 69 72 65 64 4c 6f 63 6b   int desiredLock
29e0: 2c 20 69 6e 74 20 2a 67 6f 74 4c 6f 63 6b 29 7b  , int *gotLock){
29f0: 0a 20 20 72 65 74 75 72 6e 20 67 2e 70 56 66 73  .  return g.pVfs
2a00: 2d 3e 78 53 68 6d 4c 6f 63 6b 28 70 2c 20 64 65  ->xShmLock(p, de
2a10: 73 69 72 65 64 4c 6f 63 6b 2c 20 67 6f 74 4c 6f  siredLock, gotLo
2a20: 63 6b 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  ck);.}.static in
2a30: 74 20 64 65 76 73 79 6d 53 68 6d 43 6c 6f 73 65  t devsymShmClose
2a40: 28 73 71 6c 69 74 65 33 5f 73 68 6d 20 2a 70 29  (sqlite3_shm *p)
2a50: 7b 0a 20 20 72 65 74 75 72 6e 20 67 2e 70 56 66  {.  return g.pVf
2a60: 73 2d 3e 78 53 68 6d 43 6c 6f 73 65 28 70 29 3b  s->xShmClose(p);
2a70: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  .}.static int de
2a80: 76 73 79 6d 53 68 6d 44 65 6c 65 74 65 28 73 71  vsymShmDelete(sq
2a90: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2aa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2ab0: 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 2e  me){.  return g.
2ac0: 70 56 66 73 2d 3e 78 53 68 6d 44 65 6c 65 74 65  pVfs->xShmDelete
2ad0: 28 67 2e 70 56 66 73 2c 20 7a 4e 61 6d 65 29 3b  (g.pVfs, zName);
2ae0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70  .}../*.** This p
2af0: 72 6f 63 65 64 75 72 65 20 72 65 67 69 73 74 65  rocedure registe
2b00: 72 73 20 74 68 65 20 64 65 76 73 79 6d 20 76 66  rs the devsym vf
2b10: 73 20 77 69 74 68 20 53 51 4c 69 74 65 2e 20 49  s with SQLite. I
2b20: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69  f the argument i
2b30: 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 64  s.** true, the d
2b40: 65 76 73 79 6d 20 76 66 73 20 62 65 63 6f 6d 65  evsym vfs become
2b50: 73 20 74 68 65 20 6e 65 77 20 64 65 66 61 75 6c  s the new defaul
2b60: 74 20 76 66 73 2e 20 49 74 20 69 73 20 74 68 65  t vfs. It is the
2b70: 20 6f 6e 6c 79 20 70 75 62 6c 69 63 6c 79 0a 2a   only publicly.*
2b80: 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 75 6e 63  * available func
2b90: 74 69 6f 6e 20 69 6e 20 74 68 69 73 20 66 69 6c  tion in this fil
2ba0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 64 65 76 73 79  e..*/.void devsy
2bb0: 6d 5f 72 65 67 69 73 74 65 72 28 69 6e 74 20 69  m_register(int i
2bc0: 44 65 76 69 63 65 43 68 61 72 2c 20 69 6e 74 20  DeviceChar, int 
2bd0: 69 53 65 63 74 6f 72 53 69 7a 65 29 7b 0a 20 20  iSectorSize){.  
2be0: 69 66 28 20 67 2e 70 56 66 73 3d 3d 30 20 29 7b  if( g.pVfs==0 ){
2bf0: 0a 20 20 20 20 67 2e 70 56 66 73 20 3d 20 73 71  .    g.pVfs = sq
2c00: 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
2c10: 29 3b 0a 20 20 20 20 64 65 76 73 79 6d 5f 76 66  );.    devsym_vf
2c20: 73 2e 73 7a 4f 73 46 69 6c 65 20 2b 3d 20 67 2e  s.szOsFile += g.
2c30: 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 3b 0a  pVfs->szOsFile;.
2c40: 20 20 20 20 64 65 76 73 79 6d 5f 76 66 73 2e 78      devsym_vfs.x
2c50: 53 68 6d 4f 70 65 6e 20 3d 20 28 67 2e 70 56 66  ShmOpen = (g.pVf
2c60: 73 2d 3e 78 53 68 6d 4f 70 65 6e 20 3f 20 64 65  s->xShmOpen ? de
2c70: 76 73 79 6d 53 68 6d 4f 70 65 6e 20 3a 20 30 29  vsymShmOpen : 0)
2c80: 3b 0a 20 20 20 20 64 65 76 73 79 6d 5f 76 66 73  ;.    devsym_vfs
2c90: 2e 78 53 68 6d 53 69 7a 65 20 3d 20 28 67 2e 70  .xShmSize = (g.p
2ca0: 56 66 73 2d 3e 78 53 68 6d 53 69 7a 65 20 3f 20  Vfs->xShmSize ? 
2cb0: 64 65 76 73 79 6d 53 68 6d 53 69 7a 65 20 3a 20  devsymShmSize : 
2cc0: 30 29 3b 0a 20 20 20 20 64 65 76 73 79 6d 5f 76  0);.    devsym_v
2cd0: 66 73 2e 78 53 68 6d 47 65 74 20 3d 20 28 67 2e  fs.xShmGet = (g.
2ce0: 70 56 66 73 2d 3e 78 53 68 6d 47 65 74 20 3f 20  pVfs->xShmGet ? 
2cf0: 64 65 76 73 79 6d 53 68 6d 47 65 74 20 3a 20 30  devsymShmGet : 0
2d00: 29 3b 0a 20 20 20 20 64 65 76 73 79 6d 5f 76 66  );.    devsym_vf
2d10: 73 2e 78 53 68 6d 52 65 6c 65 61 73 65 20 3d 20  s.xShmRelease = 
2d20: 28 67 2e 70 56 66 73 2d 3e 78 53 68 6d 52 65 6c  (g.pVfs->xShmRel
2d30: 65 61 73 65 20 3f 20 64 65 76 73 79 6d 53 68 6d  ease ? devsymShm
2d40: 52 65 6c 65 61 73 65 20 3a 20 30 29 3b 0a 20 20  Release : 0);.  
2d50: 20 20 64 65 76 73 79 6d 5f 76 66 73 2e 78 53 68    devsym_vfs.xSh
2d60: 6d 4c 6f 63 6b 20 3d 20 28 67 2e 70 56 66 73 2d  mLock = (g.pVfs-
2d70: 3e 78 53 68 6d 4c 6f 63 6b 20 3f 20 64 65 76 73  >xShmLock ? devs
2d80: 79 6d 53 68 6d 4c 6f 63 6b 20 3a 20 30 29 3b 0a  ymShmLock : 0);.
2d90: 20 20 20 20 64 65 76 73 79 6d 5f 76 66 73 2e 78      devsym_vfs.x
2da0: 53 68 6d 43 6c 6f 73 65 20 3d 20 28 67 2e 70 56  ShmClose = (g.pV
2db0: 66 73 2d 3e 78 53 68 6d 43 6c 6f 73 65 20 3f 20  fs->xShmClose ? 
2dc0: 64 65 76 73 79 6d 53 68 6d 43 6c 6f 73 65 20 3a  devsymShmClose :
2dd0: 20 30 29 3b 0a 20 20 20 20 64 65 76 73 79 6d 5f   0);.    devsym_
2de0: 76 66 73 2e 78 53 68 6d 44 65 6c 65 74 65 20 3d  vfs.xShmDelete =
2df0: 20 28 67 2e 70 56 66 73 2d 3e 78 53 68 6d 44 65   (g.pVfs->xShmDe
2e00: 6c 65 74 65 20 3f 20 64 65 76 73 79 6d 53 68 6d  lete ? devsymShm
2e10: 44 65 6c 65 74 65 20 3a 20 30 29 3b 0a 20 20 20  Delete : 0);.   
2e20: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
2e30: 69 73 74 65 72 28 26 64 65 76 73 79 6d 5f 76 66  ister(&devsym_vf
2e40: 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s, 0);.  }.  if(
2e50: 20 69 44 65 76 69 63 65 43 68 61 72 3e 3d 30 20   iDeviceChar>=0 
2e60: 29 7b 0a 20 20 20 20 67 2e 69 44 65 76 69 63 65  ){.    g.iDevice
2e70: 43 68 61 72 20 3d 20 69 44 65 76 69 63 65 43 68  Char = iDeviceCh
2e80: 61 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ar;.  }else{.   
2e90: 20 67 2e 69 44 65 76 69 63 65 43 68 61 72 20 3d   g.iDeviceChar =
2ea0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53   0;.  }.  if( iS
2eb0: 65 63 74 6f 72 53 69 7a 65 3e 3d 30 20 29 7b 0a  ectorSize>=0 ){.
2ec0: 20 20 20 20 67 2e 69 53 65 63 74 6f 72 53 69 7a      g.iSectorSiz
2ed0: 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  e = iSectorSize;
2ee0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 2e  .  }else{.    g.
2ef0: 69 53 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31  iSectorSize = 51
2f00: 32 3b 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66  2;.  }.}..#endif
2f10: 0a                                               .