/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact c8b18caae0d22762080a9c48a4e46933f48625bac7fde2af9ef8ec2a23755ac9:


0000: 2f 2a 0a 2a 2a 20 32 30 31 37 2d 31 30 2d 32 30  /*.** 2017-10-20
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
0190: 61 20 56 46 53 20 73 68 69 6d 20 74 68 61 74 20  a VFS shim that 
01a0: 61 6c 6c 6f 77 73 20 61 6e 20 53 51 4c 69 74 65  allows an SQLite
01b0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 62 65 0a   database to be.
01c0: 2a 2a 20 61 70 70 65 6e 64 65 64 20 6f 6e 74 6f  ** appended onto
01d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 73 6f 6d 65   the end of some
01e0: 20 6f 74 68 65 72 20 66 69 6c 65 2c 20 73 75 63   other file, suc
01f0: 68 20 61 73 20 61 6e 20 65 78 65 63 75 74 61 62  h as an executab
0200: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 70 65 63  le..**.** A spec
0210: 69 61 6c 20 72 65 63 6f 72 64 20 6d 75 73 74 20  ial record must 
0220: 61 70 70 65 61 72 20 61 74 20 74 68 65 20 65 6e  appear at the en
0230: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68  d of the file th
0240: 61 74 20 69 64 65 6e 74 69 66 69 65 73 20 74 68  at identifies th
0250: 65 0a 2a 2a 20 66 69 6c 65 20 61 73 20 61 6e 20  e.** file as an 
0260: 61 70 70 65 6e 64 65 64 20 64 61 74 61 62 61 73  appended databas
0270: 65 20 61 6e 64 20 70 72 6f 76 69 64 65 73 20 61  e and provides a
0280: 6e 20 6f 66 66 73 65 74 20 74 6f 20 70 61 67 65  n offset to page
0290: 20 31 2e 20 20 46 6f 72 0a 2a 2a 20 62 65 73 74   1.  For.** best
02a0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 70 61 67   performance pag
02b0: 65 20 31 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f  e 1 should be lo
02c0: 63 61 74 65 64 20 61 74 20 61 20 64 69 73 6b 20  cated at a disk 
02d0: 70 61 67 65 20 62 6f 75 6e 64 61 72 79 2c 20 74  page boundary, t
02e0: 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 69 73  hough.** that is
02f0: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 2a   not required..*
0300: 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e  *.** When openin
0310: 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73 69  g a database usi
0320: 6e 67 20 74 68 69 73 20 56 46 53 2c 20 74 68 65  ng this VFS, the
0330: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 69 67 68   connection migh
0340: 74 20 74 72 65 61 74 0a 2a 2a 20 74 68 65 20 66  t treat.** the f
0350: 69 6c 65 20 61 73 20 61 6e 20 6f 72 64 69 6e 61  ile as an ordina
0360: 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ry SQLite databa
0370: 73 65 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20  se, or it might 
0380: 74 72 65 61 74 20 69 73 20 61 73 20 61 0a 2a 2a  treat is as a.**
0390: 20 64 61 74 61 62 61 73 65 20 61 70 70 65 6e 64   database append
03a0: 65 64 20 6f 6e 74 6f 20 73 6f 6d 65 20 6f 74 68  ed onto some oth
03b0: 65 72 20 66 69 6c 65 2e 20 20 48 65 72 65 20 61  er file.  Here a
03c0: 72 65 20 74 68 65 20 72 75 6c 65 73 3a 0a 2a 2a  re the rules:.**
03d0: 0a 2a 2a 20 20 28 31 29 20 20 57 68 65 6e 20 6f  .**  (1)  When o
03e0: 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 65 6d 70  pening a new emp
03f0: 74 79 20 66 69 6c 65 2c 20 74 68 61 74 20 66 69  ty file, that fi
0400: 6c 65 20 69 73 20 74 72 65 61 74 65 64 20 61 73  le is treated as
0410: 20 61 6e 20 6f 72 64 69 6e 61 72 79 0a 2a 2a 20   an ordinary.** 
0420: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 0a        database..
0430: 2a 2a 0a 2a 2a 20 20 28 32 29 20 20 57 68 65 6e  **.**  (2)  When
0440: 20 6f 70 65 6e 69 6e 67 20 61 20 66 69 6c 65 20   opening a file 
0450: 74 68 61 74 20 62 65 67 69 6e 73 20 77 69 74 68  that begins with
0460: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 53 51   the standard SQ
0470: 4c 69 74 65 20 70 72 65 66 69 78 0a 2a 2a 20 20  Lite prefix.**  
0480: 20 20 20 20 20 73 74 72 69 6e 67 20 22 53 51 4c       string "SQL
0490: 69 74 65 20 66 6f 72 6d 61 74 20 33 22 2c 20 74  ite format 3", t
04a0: 68 61 74 20 66 69 6c 65 20 69 73 20 74 72 65 61  hat file is trea
04b0: 74 65 64 20 61 73 20 61 6e 20 6f 72 64 69 6e 61  ted as an ordina
04c0: 72 79 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  ry.**       data
04d0: 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 33 29  base..**.**  (3)
04e0: 20 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61    When opening a
04f0: 20 66 69 6c 65 20 74 68 61 74 20 65 6e 64 73 20   file that ends 
0500: 77 69 74 68 20 74 68 65 20 61 70 70 65 6e 64 76  with the appendv
0510: 66 73 20 74 72 61 69 6c 65 72 20 73 74 72 69 6e  fs trailer strin
0520: 67 0a 2a 2a 20 20 20 20 20 20 20 22 53 74 61 72  g.**       "Star
0530: 74 2d 4f 66 2d 53 51 4c 69 74 65 33 2d 4e 4e 4e  t-Of-SQLite3-NNN
0540: 4e 4e 4e 4e 4e 22 20 74 68 61 74 20 66 69 6c 65  NNNNN" that file
0550: 20 69 73 20 74 72 65 61 74 65 64 20 61 73 20 61   is treated as a
0560: 6e 20 61 70 70 65 6e 64 65 64 0a 2a 2a 20 20 20  n appended.**   
0570: 20 20 20 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a      database..**
0580: 0a 2a 2a 20 20 28 34 29 20 20 49 66 20 6e 6f 6e  .**  (4)  If non
0590: 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  e of the above a
05a0: 70 70 6c 79 20 61 6e 64 20 74 68 65 20 53 51 4c  pply and the SQL
05b0: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
05c0: 66 6c 61 67 20 69 73 0a 2a 2a 20 20 20 20 20 20  flag is.**      
05d0: 20 73 65 74 2c 20 74 68 65 6e 20 61 20 6e 65 77   set, then a new
05e0: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 70 70   database is app
05f0: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 61 6c 72  ended to the alr
0600: 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 66 69  eady existing fi
0610: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 35 29 20 20  le..**.**  (5)  
0620: 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
0630: 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65  E_CANTOPEN is re
0640: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f  turned..**.** To
0650: 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
0660: 72 79 20 63 6f 6d 70 6c 69 63 61 74 69 6f 6e 73  ry complications
0670: 20 77 69 74 68 20 74 68 65 20 50 45 4e 44 49 4e   with the PENDIN
0680: 47 5f 42 59 54 45 2c 20 74 68 65 20 73 69 7a 65  G_BYTE, the size
0690: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20   of.** the file 
06a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 64  containing the d
06b0: 61 74 61 62 61 73 65 20 69 73 20 6c 69 6d 69 74  atabase is limit
06c0: 65 64 20 74 6f 20 31 47 42 2e 20 20 54 68 69 73  ed to 1GB.  This
06d0: 20 56 46 53 20 77 69 6c 6c 20 72 65 66 75 73 65   VFS will refuse
06e0: 0a 2a 2a 20 74 6f 20 72 65 61 64 20 6f 72 20 77  .** to read or w
06f0: 72 69 74 65 20 70 61 73 74 20 74 68 65 20 31 47  rite past the 1G
0700: 42 20 6d 61 72 6b 2e 20 20 54 68 69 73 20 72 65  B mark.  This re
0710: 73 74 72 69 63 74 69 6f 6e 20 6d 69 67 68 74 20  striction might 
0720: 62 65 20 6c 69 66 74 65 64 20 69 6e 0a 2a 2a 20  be lifted in.** 
0730: 66 75 74 75 72 65 20 76 65 72 73 69 6f 6e 73 2e  future versions.
0740: 20 20 46 6f 72 20 6e 6f 77 2c 20 69 66 20 79 6f    For now, if yo
0750: 75 20 6e 65 65 64 20 61 20 6c 61 72 67 65 20 64  u need a large d
0760: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 6b 65  atabase, then ke
0770: 65 70 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ep the.** databa
0780: 73 65 20 69 6e 20 61 20 73 65 70 61 72 61 74 65  se in a separate
0790: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
07a0: 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
07b0: 70 65 6e 65 64 20 69 73 20 6e 6f 74 20 61 6e 20  pened is not an 
07c0: 61 70 70 65 6e 64 65 64 20 64 61 74 61 62 61 73  appended databas
07d0: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73 68 69  e, then this shi
07e0: 6d 20 69 73 0a 2a 2a 20 61 20 70 61 73 73 2d 74  m is.** a pass-t
07f0: 68 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 20  hrough into the 
0800: 64 65 66 61 75 6c 74 20 75 6e 64 65 72 6c 79 69  default underlyi
0810: 6e 67 20 56 46 53 2e 0a 2a 2a 2f 0a 23 69 6e 63  ng VFS..**/.#inc
0820: 6c 75 64 65 20 3c 73 71 6c 69 74 65 33 65 78 74  lude <sqlite3ext
0830: 2e 68 3e 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e  .h>.SQLITE_EXTEN
0840: 53 49 4f 4e 5f 49 4e 49 54 31 0a 23 69 6e 63 6c  SION_INIT1.#incl
0850: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
0860: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
0870: 68 3e 0a 0a 2f 2a 20 54 68 65 20 61 70 70 65 6e  h>../* The appen
0880: 64 20 6d 61 72 6b 20 61 74 20 74 68 65 20 65 6e  d mark at the en
0890: 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
08a0: 65 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e is:.**.**     
08b0: 53 74 61 72 74 2d 4f 66 2d 53 51 4c 69 74 65 33  Start-Of-SQLite3
08c0: 2d 4e 4e 4e 4e 4e 4e 4e 4e 0a 2a 2a 20 20 20 20  -NNNNNNNN.**    
08d0: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35   123456789 12345
08e0: 36 37 38 39 20 31 32 33 34 35 0a 2a 2a 0a 2a 2a  6789 12345.**.**
08f0: 20 54 68 65 20 4e 4e 4e 4e 4e 4e 4e 4e 20 72 65   The NNNNNNNN re
0900: 70 72 65 73 65 6e 74 73 20 61 20 36 34 2d 62 69  presents a 64-bi
0910: 74 20 62 69 67 2d 65 6e 64 69 61 6e 20 75 6e 73  t big-endian uns
0920: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 77 68  igned integer wh
0930: 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 6f 66  ich is.** the of
0940: 66 73 65 74 20 74 6f 20 70 61 67 65 20 31 2e 0a  fset to page 1..
0950: 2a 2f 0a 23 64 65 66 69 6e 65 20 41 50 4e 44 5f  */.#define APND_
0960: 4d 41 52 4b 5f 50 52 45 46 49 58 20 20 20 20 20  MARK_PREFIX     
0970: 22 53 74 61 72 74 2d 4f 66 2d 53 51 4c 69 74 65  "Start-Of-SQLite
0980: 33 2d 22 0a 23 64 65 66 69 6e 65 20 41 50 4e 44  3-".#define APND
0990: 5f 4d 41 52 4b 5f 50 52 45 46 49 58 5f 53 5a 20  _MARK_PREFIX_SZ 
09a0: 20 31 37 0a 23 64 65 66 69 6e 65 20 41 50 4e 44   17.#define APND
09b0: 5f 4d 41 52 4b 5f 53 49 5a 45 20 20 20 20 20 20  _MARK_SIZE      
09c0: 20 32 35 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d   25../*.** Maxim
09d0: 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63  um size of the c
09e0: 6f 6d 62 69 6e 65 64 20 70 72 65 66 69 78 20 2b  ombined prefix +
09f0: 20 64 61 74 61 62 61 73 65 20 2b 20 61 70 70 65   database + appe
0a00: 6e 64 2d 6d 61 72 6b 2e 20 20 54 68 69 73 0a 2a  nd-mark.  This.*
0a10: 2a 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74  * must be less t
0a20: 68 61 6e 20 30 78 34 30 30 30 30 30 30 30 20 74  han 0x40000000 t
0a30: 6f 20 61 76 6f 69 64 20 6c 6f 63 6b 69 6e 67 20  o avoid locking 
0a40: 69 73 73 75 65 73 20 6f 6e 20 57 69 6e 64 6f 77  issues on Window
0a50: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 50  s..*/.#define AP
0a60: 4e 44 5f 4d 41 58 5f 53 49 5a 45 20 20 28 36 35  ND_MAX_SIZE  (65
0a70: 35 33 36 2a 31 35 32 35 39 29 0a 0a 2f 2a 0a 2a  536*15259)../*.*
0a80: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
0a90: 61 74 69 6f 6e 20 6f 66 20 6f 62 6a 65 63 74 73  ation of objects
0aa0: 20 75 73 65 64 20 62 79 20 74 68 69 73 20 75 74   used by this ut
0ab0: 69 6c 69 74 79 0a 2a 2f 0a 74 79 70 65 64 65 66  ility.*/.typedef
0ac0: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
0ad0: 76 66 73 20 41 70 6e 64 56 66 73 3b 0a 74 79 70  vfs ApndVfs;.typ
0ae0: 65 64 65 66 20 73 74 72 75 63 74 20 41 70 6e 64  edef struct Apnd
0af0: 46 69 6c 65 20 41 70 6e 64 46 69 6c 65 3b 0a 0a  File ApndFile;..
0b00: 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 61 20 6c  /* Access to a l
0b10: 6f 77 65 72 2d 6c 65 76 65 6c 20 56 46 53 20 74  ower-level VFS t
0b20: 68 61 74 20 28 6d 69 67 68 74 29 20 69 6d 70 6c  hat (might) impl
0b30: 65 6d 65 6e 74 20 64 79 6e 61 6d 69 63 20 6c 6f  ement dynamic lo
0b40: 61 64 69 6e 67 2c 0a 2a 2a 20 61 63 63 65 73 73  ading,.** access
0b50: 20 74 6f 20 72 61 6e 64 6f 6d 6e 65 73 73 2c 20   to randomness, 
0b60: 65 74 63 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  etc..*/.#define 
0b70: 4f 52 49 47 56 46 53 28 70 29 20 20 28 28 73 71  ORIGVFS(p)  ((sq
0b80: 6c 69 74 65 33 5f 76 66 73 2a 29 28 28 70 29 2d  lite3_vfs*)((p)-
0b90: 3e 70 41 70 70 44 61 74 61 29 29 0a 23 64 65 66  >pAppData)).#def
0ba0: 69 6e 65 20 4f 52 49 47 46 49 4c 45 28 70 29 20  ine ORIGFILE(p) 
0bb0: 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
0bc0: 28 28 28 41 70 6e 64 46 69 6c 65 2a 29 28 70 29  (((ApndFile*)(p)
0bd0: 29 2b 31 29 29 0a 0a 2f 2a 20 41 6e 20 6f 70 65  )+1))../* An ope
0be0: 6e 20 66 69 6c 65 20 2a 2f 0a 73 74 72 75 63 74  n file */.struct
0bf0: 20 41 70 6e 64 46 69 6c 65 20 7b 0a 20 20 73 71   ApndFile {.  sq
0c00: 6c 69 74 65 33 5f 66 69 6c 65 20 62 61 73 65 3b  lite3_file base;
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0c20: 20 49 4f 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 20   IO methods */. 
0c30: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
0c40: 50 67 4f 6e 65 3b 20 20 20 20 20 20 20 20 20 20  PgOne;          
0c50: 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65 74 20   /* File offset 
0c60: 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 73  to page 1 */.  s
0c70: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4d 61  qlite3_int64 iMa
0c80: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rk;            /
0c90: 2a 20 53 74 61 72 74 20 6f 66 20 74 68 65 20 61  * Start of the a
0ca0: 70 70 65 6e 64 2d 6d 61 72 6b 20 2a 2f 0a 7d 3b  ppend-mark */.};
0cb0: 0a 0a 2f 2a 0a 2a 2a 20 4d 65 74 68 6f 64 73 20  ../*.** Methods 
0cc0: 66 6f 72 20 41 70 6e 64 46 69 6c 65 0a 2a 2f 0a  for ApndFile.*/.
0cd0: 73 74 61 74 69 63 20 69 6e 74 20 61 70 6e 64 43  static int apndC
0ce0: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
0cf0: 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
0d00: 61 70 6e 64 52 65 61 64 28 73 71 6c 69 74 65 33  apndRead(sqlite3
0d10: 5f 66 69 6c 65 2a 2c 20 76 6f 69 64 2a 2c 20 69  _file*, void*, i
0d20: 6e 74 20 69 41 6d 74 2c 20 73 71 6c 69 74 65 33  nt iAmt, sqlite3
0d30: 5f 69 6e 74 36 34 20 69 4f 66 73 74 29 3b 0a 73  _int64 iOfst);.s
0d40: 74 61 74 69 63 20 69 6e 74 20 61 70 6e 64 57 72  tatic int apndWr
0d50: 69 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ite(sqlite3_file
0d60: 2a 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  *,const void*,in
0d70: 74 20 69 41 6d 74 2c 20 73 71 6c 69 74 65 33 5f  t iAmt, sqlite3_
0d80: 69 6e 74 36 34 20 69 4f 66 73 74 29 3b 0a 73 74  int64 iOfst);.st
0d90: 61 74 69 63 20 69 6e 74 20 61 70 6e 64 54 72 75  atic int apndTru
0da0: 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
0db0: 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  le*, sqlite3_int
0dc0: 36 34 20 73 69 7a 65 29 3b 0a 73 74 61 74 69 63  64 size);.static
0dd0: 20 69 6e 74 20 61 70 6e 64 53 79 6e 63 28 73 71   int apndSync(sq
0de0: 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
0df0: 20 66 6c 61 67 73 29 3b 0a 73 74 61 74 69 63 20   flags);.static 
0e00: 69 6e 74 20 61 70 6e 64 46 69 6c 65 53 69 7a 65  int apndFileSize
0e10: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
0e20: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
0e30: 53 69 7a 65 29 3b 0a 73 74 61 74 69 63 20 69 6e  Size);.static in
0e40: 74 20 61 70 6e 64 4c 6f 63 6b 28 73 71 6c 69 74  t apndLock(sqlit
0e50: 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  e3_file*, int);.
0e60: 73 74 61 74 69 63 20 69 6e 74 20 61 70 6e 64 55  static int apndU
0e70: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
0e80: 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
0e90: 63 20 69 6e 74 20 61 70 6e 64 43 68 65 63 6b 52  c int apndCheckR
0ea0: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
0eb0: 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 2a  te3_file*, int *
0ec0: 70 52 65 73 4f 75 74 29 3b 0a 73 74 61 74 69 63  pResOut);.static
0ed0: 20 69 6e 74 20 61 70 6e 64 46 69 6c 65 43 6f 6e   int apndFileCon
0ee0: 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
0ef0: 65 2a 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  e*, int op, void
0f00: 20 2a 70 41 72 67 29 3b 0a 73 74 61 74 69 63 20   *pArg);.static 
0f10: 69 6e 74 20 61 70 6e 64 53 65 63 74 6f 72 53 69  int apndSectorSi
0f20: 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ze(sqlite3_file*
0f30: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70  );.static int ap
0f40: 6e 64 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ndDeviceCharacte
0f50: 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
0f60: 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69  file*);.static i
0f70: 6e 74 20 61 70 6e 64 53 68 6d 4d 61 70 28 73 71  nt apndShmMap(sq
0f80: 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
0f90: 20 69 50 67 2c 20 69 6e 74 20 70 67 73 7a 2c 20   iPg, int pgsz, 
0fa0: 69 6e 74 2c 20 76 6f 69 64 20 76 6f 6c 61 74 69  int, void volati
0fb0: 6c 65 2a 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  le**);.static in
0fc0: 74 20 61 70 6e 64 53 68 6d 4c 6f 63 6b 28 73 71  t apndShmLock(sq
0fd0: 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
0fe0: 20 6f 66 66 73 65 74 2c 20 69 6e 74 20 6e 2c 20   offset, int n, 
0ff0: 69 6e 74 20 66 6c 61 67 73 29 3b 0a 73 74 61 74  int flags);.stat
1000: 69 63 20 76 6f 69 64 20 61 70 6e 64 53 68 6d 42  ic void apndShmB
1010: 61 72 72 69 65 72 28 73 71 6c 69 74 65 33 5f 66  arrier(sqlite3_f
1020: 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  ile*);.static in
1030: 74 20 61 70 6e 64 53 68 6d 55 6e 6d 61 70 28 73  t apndShmUnmap(s
1040: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
1050: 74 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 73  t deleteFlag);.s
1060: 74 61 74 69 63 20 69 6e 74 20 61 70 6e 64 46 65  tatic int apndFe
1070: 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
1080: 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  *, sqlite3_int64
1090: 20 69 4f 66 73 74 2c 20 69 6e 74 20 69 41 6d 74   iOfst, int iAmt
10a0: 2c 20 76 6f 69 64 20 2a 2a 70 70 29 3b 0a 73 74  , void **pp);.st
10b0: 61 74 69 63 20 69 6e 74 20 61 70 6e 64 55 6e 66  atic int apndUnf
10c0: 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c  etch(sqlite3_fil
10d0: 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  e*, sqlite3_int6
10e0: 34 20 69 4f 66 73 74 2c 20 76 6f 69 64 20 2a 70  4 iOfst, void *p
10f0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65 74 68 6f 64  );../*.** Method
1100: 73 20 66 6f 72 20 41 70 6e 64 56 66 73 0a 2a 2f  s for ApndVfs.*/
1110: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 6e 64  .static int apnd
1120: 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
1130: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c  *, const char *,
1140: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20   sqlite3_file*, 
1150: 69 6e 74 20 2c 20 69 6e 74 20 2a 29 3b 0a 73 74  int , int *);.st
1160: 61 74 69 63 20 69 6e 74 20 61 70 6e 64 44 65 6c  atic int apndDel
1170: 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a  ete(sqlite3_vfs*
1180: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
1190: 61 6d 65 2c 20 69 6e 74 20 73 79 6e 63 44 69 72  ame, int syncDir
11a0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70  );.static int ap
11b0: 6e 64 41 63 63 65 73 73 28 73 71 6c 69 74 65 33  ndAccess(sqlite3
11c0: 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61  _vfs*, const cha
11d0: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 66 6c  r *zName, int fl
11e0: 61 67 73 2c 20 69 6e 74 20 2a 29 3b 0a 73 74 61  ags, int *);.sta
11f0: 74 69 63 20 69 6e 74 20 61 70 6e 64 46 75 6c 6c  tic int apndFull
1200: 50 61 74 68 6e 61 6d 65 28 73 71 6c 69 74 65 33  Pathname(sqlite3
1210: 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61  _vfs*, const cha
1220: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 2c 20 63  r *zName, int, c
1230: 68 61 72 20 2a 7a 4f 75 74 29 3b 0a 73 74 61 74  har *zOut);.stat
1240: 69 63 20 76 6f 69 64 20 2a 61 70 6e 64 44 6c 4f  ic void *apndDlO
1250: 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a  pen(sqlite3_vfs*
1260: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
1270: 69 6c 65 6e 61 6d 65 29 3b 0a 73 74 61 74 69 63  ilename);.static
1280: 20 76 6f 69 64 20 61 70 6e 64 44 6c 45 72 72 6f   void apndDlErro
1290: 72 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20  r(sqlite3_vfs*, 
12a0: 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72 20  int nByte, char 
12b0: 2a 7a 45 72 72 4d 73 67 29 3b 0a 73 74 61 74 69  *zErrMsg);.stati
12c0: 63 20 76 6f 69 64 20 28 2a 61 70 6e 64 44 6c 53  c void (*apndDlS
12d0: 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ym(sqlite3_vfs *
12e0: 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 2c 20 63  pVfs, void *p, c
12f0: 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29  onst char*zSym))
1300: 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63 20 76  (void);.static v
1310: 6f 69 64 20 61 70 6e 64 44 6c 43 6c 6f 73 65 28  oid apndDlClose(
1320: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 76 6f  sqlite3_vfs*, vo
1330: 69 64 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  id*);.static int
1340: 20 61 70 6e 64 52 61 6e 64 6f 6d 6e 65 73 73 28   apndRandomness(
1350: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e  sqlite3_vfs*, in
1360: 74 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a  t nByte, char *z
1370: 4f 75 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  Out);.static int
1380: 20 61 70 6e 64 53 6c 65 65 70 28 73 71 6c 69 74   apndSleep(sqlit
1390: 65 33 5f 76 66 73 2a 2c 20 69 6e 74 20 6d 69 63  e3_vfs*, int mic
13a0: 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 73 74 61 74  roseconds);.stat
13b0: 69 63 20 69 6e 74 20 61 70 6e 64 43 75 72 72 65  ic int apndCurre
13c0: 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76  ntTime(sqlite3_v
13d0: 66 73 2a 2c 20 64 6f 75 62 6c 65 2a 29 3b 0a 73  fs*, double*);.s
13e0: 74 61 74 69 63 20 69 6e 74 20 61 70 6e 64 47 65  tatic int apndGe
13f0: 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
1400: 65 33 5f 76 66 73 2a 2c 20 69 6e 74 2c 20 63 68  e3_vfs*, int, ch
1410: 61 72 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  ar *);.static in
1420: 74 20 61 70 6e 64 43 75 72 72 65 6e 74 54 69 6d  t apndCurrentTim
1430: 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76  eInt64(sqlite3_v
1440: 66 73 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  fs*, sqlite3_int
1450: 36 34 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  64*);.static int
1460: 20 61 70 6e 64 53 65 74 53 79 73 74 65 6d 43 61   apndSetSystemCa
1470: 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  ll(sqlite3_vfs*,
1480: 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c   const char*,sql
1490: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
14a0: 29 3b 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  );.static sqlite
14b0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 61 70  3_syscall_ptr ap
14c0: 6e 64 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  ndGetSystemCall(
14d0: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f  sqlite3_vfs*, co
14e0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 3b 0a 73 74  nst char *z);.st
14f0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1500: 2a 61 70 6e 64 4e 65 78 74 53 79 73 74 65 6d 43  *apndNextSystemC
1510: 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 2a  all(sqlite3_vfs*
1520: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
1530: 61 6d 65 29 3b 0a 0a 73 74 61 74 69 63 20 73 71  ame);..static sq
1540: 6c 69 74 65 33 5f 76 66 73 20 61 70 6e 64 5f 76  lite3_vfs apnd_v
1550: 66 73 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20  fs = {.  3,     
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1570: 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
1580: 6f 6e 20 28 73 65 74 20 77 68 65 6e 20 72 65 67  on (set when reg
1590: 69 73 74 65 72 65 64 29 20 2a 2f 0a 20 20 30 2c  istered) */.  0,
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
15c0: 7a 4f 73 46 69 6c 65 20 28 73 65 74 20 77 68 65  zOsFile (set whe
15d0: 6e 20 72 65 67 69 73 74 65 72 65 64 29 20 2a 2f  n registered) */
15e0: 0a 20 20 31 30 32 34 2c 20 20 20 20 20 20 20 20  .  1024,        
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
1610: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1630: 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20    /* pNext */.  
1640: 22 61 70 6e 64 76 66 73 22 2c 20 20 20 20 20 20  "apndvfs",      
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1660: 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20   zName */.  0,  
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70            /* pAp
1690: 70 44 61 74 61 20 28 73 65 74 20 77 68 65 6e 20  pData (set when 
16a0: 72 65 67 69 73 74 65 72 65 64 29 20 2a 2f 20 0a  registered) */ .
16b0: 20 20 61 70 6e 64 4f 70 65 6e 2c 20 20 20 20 20    apndOpen,     
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 61 70  /* xOpen */.  ap
16e0: 6e 64 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  ndDelete,       
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1700: 44 65 6c 65 74 65 20 2a 2f 0a 20 20 61 70 6e 64  Delete */.  apnd
1710: 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
1720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63            /* xAc
1730: 63 65 73 73 20 2a 2f 0a 20 20 61 70 6e 64 46 75  cess */.  apndFu
1740: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
1750: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c          /* xFull
1760: 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 61 70  Pathname */.  ap
1770: 6e 64 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20  ndDlOpen,       
1780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1790: 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 61 70 6e 64  DlOpen */.  apnd
17a0: 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
17b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
17c0: 45 72 72 6f 72 20 2a 2f 0a 20 20 61 70 6e 64 44  Error */.  apndD
17d0: 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20  lSym,           
17e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
17f0: 79 6d 20 2a 2f 0a 20 20 61 70 6e 64 44 6c 43 6c  ym */.  apndDlCl
1800: 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
1810: 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
1820: 65 20 2a 2f 0a 20 20 61 70 6e 64 52 61 6e 64 6f  e */.  apndRando
1830: 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  mness,          
1840: 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
1850: 65 73 73 20 2a 2f 0a 20 20 61 70 6e 64 53 6c 65  ess */.  apndSle
1860: 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ep,             
1870: 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70         /* xSleep
1880: 20 2a 2f 0a 20 20 61 70 6e 64 43 75 72 72 65 6e   */.  apndCurren
1890: 74 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20  tTime,          
18a0: 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
18b0: 69 6d 65 20 2a 2f 0a 20 20 61 70 6e 64 47 65 74  ime */.  apndGet
18c0: 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20  LastError,      
18d0: 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61         /* xGetLa
18e0: 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 61 70 6e  stError */.  apn
18f0: 64 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  dCurrentTimeInt6
1900: 34 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43  4,         /* xC
1910: 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
1920: 2a 2f 0a 20 20 61 70 6e 64 53 65 74 53 79 73 74  */.  apndSetSyst
1930: 65 6d 43 61 6c 6c 2c 20 20 20 20 20 20 20 20 20  emCall,         
1940: 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d     /* xSetSystem
1950: 43 61 6c 6c 20 2a 2f 0a 20 20 61 70 6e 64 47 65  Call */.  apndGe
1960: 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
1970: 20 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74 53          /* xGetS
1980: 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 61  ystemCall */.  a
1990: 70 6e 64 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  pndNextSystemCal
19a0: 6c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l            /* 
19b0: 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20  xNextSystemCall 
19c0: 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 63 6f  */.};..static co
19d0: 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
19e0: 65 74 68 6f 64 73 20 61 70 6e 64 5f 69 6f 5f 6d  ethods apnd_io_m
19f0: 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 33 2c 20  ethods = {.  3, 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a20: 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 61 70  iVersion */.  ap
1a30: 6e 64 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ndClose,        
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a50: 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 61 70 6e   xClose */.  apn
1a60: 64 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20  dRead,          
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a80: 78 52 65 61 64 20 2a 2f 0a 20 20 61 70 6e 64 57  xRead */.  apndW
1a90: 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
1aa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57             /* xW
1ab0: 72 69 74 65 20 2a 2f 0a 20 20 61 70 6e 64 54 72  rite */.  apndTr
1ac0: 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
1ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72            /* xTr
1ae0: 75 6e 63 61 74 65 20 2a 2f 0a 20 20 61 70 6e 64  uncate */.  apnd
1af0: 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Sync,           
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1b10: 53 79 6e 63 20 2a 2f 0a 20 20 61 70 6e 64 46 69  Sync */.  apndFi
1b20: 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
1b30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
1b40: 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 61 70 6e 64  leSize */.  apnd
1b50: 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1b70: 4c 6f 63 6b 20 2a 2f 0a 20 20 61 70 6e 64 55 6e  Lock */.  apndUn
1b80: 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
1b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
1ba0: 6c 6f 63 6b 20 2a 2f 0a 20 20 61 70 6e 64 43 68  lock */.  apndCh
1bb0: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
1bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68            /* xCh
1bd0: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1be0: 2a 2f 0a 20 20 61 70 6e 64 46 69 6c 65 43 6f 6e  */.  apndFileCon
1bf0: 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
1c00: 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
1c10: 74 72 6f 6c 20 2a 2f 0a 20 20 61 70 6e 64 53 65  trol */.  apndSe
1c20: 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20  ctorSize,       
1c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
1c40: 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 61 70  ctorSize */.  ap
1c50: 6e 64 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ndDeviceCharacte
1c60: 72 69 73 74 69 63 73 2c 20 20 20 20 20 20 2f 2a  ristics,      /*
1c70: 20 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65   xDeviceCharacte
1c80: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 61 70 6e  ristics */.  apn
1c90: 64 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20  dShmMap,        
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cb0: 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 61 70 6e  xShmMap */.  apn
1cc0: 64 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20  dShmLock,       
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ce0: 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 61 70  xShmLock */.  ap
1cf0: 6e 64 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20  ndShmBarrier,   
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d10: 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a   xShmBarrier */.
1d20: 20 20 61 70 6e 64 53 68 6d 55 6e 6d 61 70 2c 20    apndShmUnmap, 
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a    /* xShmUnmap *
1d50: 2f 0a 20 20 61 70 6e 64 46 65 74 63 68 2c 20 20  /.  apndFetch,  
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d70: 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f      /* xFetch */
1d80: 0a 20 20 61 70 6e 64 55 6e 66 65 74 63 68 20 20  .  apndUnfetch  
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da0: 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a     /* xUnfetch *
1db0: 2f 0a 7d 3b 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c  /.};..../*.** Cl
1dc0: 6f 73 65 20 61 6e 20 61 70 6e 64 2d 66 69 6c 65  ose an apnd-file
1dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1de0: 61 70 6e 64 43 6c 6f 73 65 28 73 71 6c 69 74 65  apndClose(sqlite
1df0: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
1e00: 20 20 70 46 69 6c 65 20 3d 20 4f 52 49 47 46 49    pFile = ORIGFI
1e10: 4c 45 28 70 46 69 6c 65 29 3b 0a 20 20 72 65 74  LE(pFile);.  ret
1e20: 75 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  urn pFile->pMeth
1e30: 6f 64 73 2d 3e 78 43 6c 6f 73 65 28 70 46 69 6c  ods->xClose(pFil
1e40: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
1e50: 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e 20 61  d data from an a
1e60: 70 6e 64 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  pnd-file..*/.sta
1e70: 74 69 63 20 69 6e 74 20 61 70 6e 64 52 65 61 64  tic int apndRead
1e80: 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1e90: 20 2a 70 46 69 6c 65 2c 20 0a 20 20 76 6f 69 64   *pFile, .  void
1ea0: 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74 20 69   *zBuf, .  int i
1eb0: 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69  Amt, .  sqlite_i
1ec0: 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a 20 20  nt64 iOfst.){.  
1ed0: 41 70 6e 64 46 69 6c 65 20 2a 70 20 3d 20 28 41  ApndFile *p = (A
1ee0: 70 6e 64 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  pndFile *)pFile;
1ef0: 0a 20 20 70 46 69 6c 65 20 3d 20 4f 52 49 47 46  .  pFile = ORIGF
1f00: 49 4c 45 28 70 46 69 6c 65 29 3b 0a 20 20 72 65  ILE(pFile);.  re
1f10: 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74  turn pFile->pMet
1f20: 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 46 69 6c  hods->xRead(pFil
1f30: 65 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69  e, zBuf, iAmt, i
1f40: 4f 66 73 74 2b 70 2d 3e 69 50 67 4f 6e 65 29 3b  Ofst+p->iPgOne);
1f50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68  .}../*.** Add th
1f60: 65 20 61 70 70 65 6e 64 2d 6d 61 72 6b 20 6f 6e  e append-mark on
1f70: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1f80: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
1f90: 63 20 69 6e 74 20 61 70 6e 64 57 72 69 74 65 4d  c int apndWriteM
1fa0: 61 72 6b 28 41 70 6e 64 46 69 6c 65 20 2a 70 2c  ark(ApndFile *p,
1fb0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
1fc0: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  File){.  int i;.
1fd0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1fe0: 61 5b 41 50 4e 44 5f 4d 41 52 4b 5f 53 49 5a 45  a[APND_MARK_SIZE
1ff0: 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 61 2c 20 41  ];.  memcpy(a, A
2000: 50 4e 44 5f 4d 41 52 4b 5f 50 52 45 46 49 58 2c  PND_MARK_PREFIX,
2010: 20 41 50 4e 44 5f 4d 41 52 4b 5f 50 52 45 46 49   APND_MARK_PREFI
2020: 58 5f 53 5a 29 3b 0a 20 20 66 6f 72 28 69 3d 30  X_SZ);.  for(i=0
2030: 3b 20 69 3c 38 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<8; i++){.   
2040: 20 61 5b 41 50 4e 44 5f 4d 41 52 4b 5f 50 52 45   a[APND_MARK_PRE
2050: 46 49 58 5f 53 5a 2b 69 5d 20 3d 20 28 70 2d 3e  FIX_SZ+i] = (p->
2060: 69 50 67 4f 6e 65 20 3e 3e 20 28 35 36 20 2d 20  iPgOne >> (56 - 
2070: 69 2a 38 29 29 20 26 20 30 78 66 66 3b 0a 20 20  i*8)) & 0xff;.  
2080: 7d 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65  }.  return pFile
2090: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 57 72 69  ->pMethods->xWri
20a0: 74 65 28 70 46 69 6c 65 2c 20 61 2c 20 41 50 4e  te(pFile, a, APN
20b0: 44 5f 4d 41 52 4b 5f 50 52 45 46 49 58 5f 53 5a  D_MARK_PREFIX_SZ
20c0: 2c 20 70 2d 3e 69 4d 61 72 6b 29 3b 0a 7d 0a 0a  , p->iMark);.}..
20d0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
20e0: 20 74 6f 20 61 6e 20 61 70 6e 64 2d 66 69 6c 65   to an apnd-file
20f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2100: 61 70 6e 64 57 72 69 74 65 28 0a 20 20 73 71 6c  apndWrite(.  sql
2110: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
2120: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
2130: 7a 42 75 66 2c 0a 20 20 69 6e 74 20 69 41 6d 74  zBuf,.  int iAmt
2140: 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ,.  sqlite_int64
2150: 20 69 4f 66 73 74 0a 29 7b 0a 20 20 69 6e 74 20   iOfst.){.  int 
2160: 72 63 3b 0a 20 20 41 70 6e 64 46 69 6c 65 20 2a  rc;.  ApndFile *
2170: 70 20 3d 20 28 41 70 6e 64 46 69 6c 65 20 2a 29  p = (ApndFile *)
2180: 70 46 69 6c 65 3b 0a 20 20 70 46 69 6c 65 20 3d  pFile;.  pFile =
2190: 20 4f 52 49 47 46 49 4c 45 28 70 46 69 6c 65 29   ORIGFILE(pFile)
21a0: 3b 0a 20 20 69 66 28 20 69 4f 66 73 74 2b 69 41  ;.  if( iOfst+iA
21b0: 6d 74 3e 3d 41 50 4e 44 5f 4d 41 58 5f 53 49 5a  mt>=APND_MAX_SIZ
21c0: 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  E ) return SQLIT
21d0: 45 5f 46 55 4c 4c 3b 0a 20 20 72 63 20 3d 20 70  E_FULL;.  rc = p
21e0: 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  File->pMethods->
21f0: 78 57 72 69 74 65 28 70 46 69 6c 65 2c 20 7a 42  xWrite(pFile, zB
2200: 75 66 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 2b  uf, iAmt, iOfst+
2210: 70 2d 3e 69 50 67 4f 6e 65 29 3b 0a 20 20 69 66  p->iPgOne);.  if
2220: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2230: 26 26 20 20 69 4f 66 73 74 20 2b 20 69 41 6d 74  &&  iOfst + iAmt
2240: 20 2b 20 70 2d 3e 69 50 67 4f 6e 65 20 3e 20 70   + p->iPgOne > p
2250: 2d 3e 69 4d 61 72 6b 20 29 7b 0a 20 20 20 20 73  ->iMark ){.    s
2260: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 20  qlite3_int64 sz 
2270: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 46  = 0;.    rc = pF
2280: 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  ile->pMethods->x
2290: 46 69 6c 65 53 69 7a 65 28 70 46 69 6c 65 2c 20  FileSize(pFile, 
22a0: 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &sz);.    if( rc
22b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22c0: 20 20 20 20 20 70 2d 3e 69 4d 61 72 6b 20 3d 20       p->iMark = 
22d0: 73 7a 20 2d 20 41 50 4e 44 5f 4d 41 52 4b 5f 53  sz - APND_MARK_S
22e0: 49 5a 45 3b 0a 20 20 20 20 20 20 69 66 28 20 69  IZE;.      if( i
22f0: 4f 66 73 74 20 2b 20 69 41 6d 74 20 2b 20 70 2d  Ofst + iAmt + p-
2300: 3e 69 50 67 4f 6e 65 20 3e 20 70 2d 3e 69 4d 61  >iPgOne > p->iMa
2310: 72 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  rk ){.        p-
2320: 3e 69 4d 61 72 6b 20 3d 20 70 2d 3e 69 50 67 4f  >iMark = p->iPgO
2330: 6e 65 20 2b 20 69 4f 66 73 74 20 2b 20 69 41 6d  ne + iOfst + iAm
2340: 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
2350: 61 70 6e 64 57 72 69 74 65 4d 61 72 6b 28 70 2c  apndWriteMark(p,
2360: 20 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d   pFile);.      }
2370: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2380: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2390: 20 54 72 75 6e 63 61 74 65 20 61 6e 20 61 70 6e   Truncate an apn
23a0: 64 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  d-file..*/.stati
23b0: 63 20 69 6e 74 20 61 70 6e 64 54 72 75 6e 63 61  c int apndTrunca
23c0: 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  te(sqlite3_file 
23d0: 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69  *pFile, sqlite_i
23e0: 6e 74 36 34 20 73 69 7a 65 29 7b 0a 20 20 69 6e  nt64 size){.  in
23f0: 74 20 72 63 3b 0a 20 20 41 70 6e 64 46 69 6c 65  t rc;.  ApndFile
2400: 20 2a 70 20 3d 20 28 41 70 6e 64 46 69 6c 65 20   *p = (ApndFile 
2410: 2a 29 70 46 69 6c 65 3b 0a 20 20 70 46 69 6c 65  *)pFile;.  pFile
2420: 20 3d 20 4f 52 49 47 46 49 4c 45 28 70 46 69 6c   = ORIGFILE(pFil
2430: 65 29 3b 0a 20 20 72 63 20 3d 20 70 46 69 6c 65  e);.  rc = pFile
2440: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 54 72 75  ->pMethods->xTru
2450: 6e 63 61 74 65 28 70 46 69 6c 65 2c 20 73 69 7a  ncate(pFile, siz
2460: 65 2b 70 2d 3e 69 50 67 4f 6e 65 2b 41 50 4e 44  e+p->iPgOne+APND
2470: 5f 4d 41 52 4b 5f 53 49 5a 45 29 3b 0a 20 20 69  _MARK_SIZE);.  i
2480: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2490: 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4d 61 72 6b   ){.    p->iMark
24a0: 20 3d 20 70 2d 3e 69 50 67 4f 6e 65 2b 73 69 7a   = p->iPgOne+siz
24b0: 65 3b 0a 20 20 20 20 72 63 20 3d 20 61 70 6e 64  e;.    rc = apnd
24c0: 57 72 69 74 65 4d 61 72 6b 28 70 2c 20 70 46 69  WriteMark(p, pFi
24d0: 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  le);.  }.  retur
24e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
24f0: 79 6e 63 20 61 6e 20 61 70 6e 64 2d 66 69 6c 65  ync an apnd-file
2500: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2510: 61 70 6e 64 53 79 6e 63 28 73 71 6c 69 74 65 33  apndSync(sqlite3
2520: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  _file *pFile, in
2530: 74 20 66 6c 61 67 73 29 7b 0a 20 20 70 46 69 6c  t flags){.  pFil
2540: 65 20 3d 20 4f 52 49 47 46 49 4c 45 28 70 46 69  e = ORIGFILE(pFi
2550: 6c 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 46  le);.  return pF
2560: 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  ile->pMethods->x
2570: 53 79 6e 63 28 70 46 69 6c 65 2c 20 66 6c 61 67  Sync(pFile, flag
2580: 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s);.}../*.** Ret
2590: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
25a0: 66 69 6c 65 2d 73 69 7a 65 20 6f 66 20 61 6e 20  file-size of an 
25b0: 61 70 6e 64 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  apnd-file..*/.st
25c0: 61 74 69 63 20 69 6e 74 20 61 70 6e 64 46 69 6c  atic int apndFil
25d0: 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
25e0: 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74  le *pFile, sqlit
25f0: 65 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b  e_int64 *pSize){
2600: 0a 20 20 41 70 6e 64 46 69 6c 65 20 2a 70 20 3d  .  ApndFile *p =
2610: 20 28 41 70 6e 64 46 69 6c 65 20 2a 29 70 46 69   (ApndFile *)pFi
2620: 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  le;.  int rc;.  
2630: 70 46 69 6c 65 20 3d 20 4f 52 49 47 46 49 4c 45  pFile = ORIGFILE
2640: 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 46 69 6c  (p);.  rc = pFil
2650: 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69  e->pMethods->xFi
2660: 6c 65 53 69 7a 65 28 70 46 69 6c 65 2c 20 70 53  leSize(pFile, pS
2670: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ize);.  if( rc==
2680: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
2690: 69 50 67 4f 6e 65 20 29 7b 0a 20 20 20 20 2a 70  iPgOne ){.    *p
26a0: 53 69 7a 65 20 2d 3d 20 70 2d 3e 69 50 67 4f 6e  Size -= p->iPgOn
26b0: 65 20 2b 20 41 50 4e 44 5f 4d 41 52 4b 5f 53 49  e + APND_MARK_SI
26c0: 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ZE;.  }.  return
26d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
26e0: 63 6b 20 61 6e 20 61 70 6e 64 2d 66 69 6c 65 2e  ck an apnd-file.
26f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2700: 70 6e 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  pndLock(sqlite3_
2710: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
2720: 20 65 4c 6f 63 6b 29 7b 0a 20 20 70 46 69 6c 65   eLock){.  pFile
2730: 20 3d 20 4f 52 49 47 46 49 4c 45 28 70 46 69 6c   = ORIGFILE(pFil
2740: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69  e);.  return pFi
2750: 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c  le->pMethods->xL
2760: 6f 63 6b 28 70 46 69 6c 65 2c 20 65 4c 6f 63 6b  ock(pFile, eLock
2770: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  );.}../*.** Unlo
2780: 63 6b 20 61 6e 20 61 70 6e 64 2d 66 69 6c 65 2e  ck an apnd-file.
2790: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
27a0: 70 6e 64 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  pndUnlock(sqlite
27b0: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
27c0: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 70 46 69  nt eLock){.  pFi
27d0: 6c 65 20 3d 20 4f 52 49 47 46 49 4c 45 28 70 46  le = ORIGFILE(pF
27e0: 69 6c 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ile);.  return p
27f0: 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  File->pMethods->
2800: 78 55 6e 6c 6f 63 6b 28 70 46 69 6c 65 2c 20 65  xUnlock(pFile, e
2810: 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Lock);.}../*.** 
2820: 43 68 65 63 6b 20 69 66 20 61 6e 6f 74 68 65 72  Check if another
2830: 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20 68 6f 6c   file-handle hol
2840: 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
2850: 63 6b 20 6f 6e 20 61 6e 20 61 70 6e 64 2d 66 69  ck on an apnd-fi
2860: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
2870: 74 20 61 70 6e 64 43 68 65 63 6b 52 65 73 65 72  t apndCheckReser
2880: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
2890: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
28a0: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 70 46   *pResOut){.  pF
28b0: 69 6c 65 20 3d 20 4f 52 49 47 46 49 4c 45 28 70  ile = ORIGFILE(p
28c0: 46 69 6c 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  File);.  return 
28d0: 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d  pFile->pMethods-
28e0: 3e 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  >xCheckReservedL
28f0: 6f 63 6b 28 70 46 69 6c 65 2c 20 70 52 65 73 4f  ock(pFile, pResO
2900: 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  ut);.}../*.** Fi
2910: 6c 65 20 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  le control metho
2920: 64 2e 20 46 6f 72 20 63 75 73 74 6f 6d 20 6f 70  d. For custom op
2930: 65 72 61 74 69 6f 6e 73 20 6f 6e 20 61 6e 20 61  erations on an a
2940: 70 6e 64 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  pnd-file..*/.sta
2950: 74 69 63 20 69 6e 74 20 61 70 6e 64 46 69 6c 65  tic int apndFile
2960: 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
2970: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
2980: 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
2990: 7b 0a 20 20 41 70 6e 64 46 69 6c 65 20 2a 70 20  {.  ApndFile *p 
29a0: 3d 20 28 41 70 6e 64 46 69 6c 65 20 2a 29 70 46  = (ApndFile *)pF
29b0: 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ile;.  int rc;. 
29c0: 20 70 46 69 6c 65 20 3d 20 4f 52 49 47 46 49 4c   pFile = ORIGFIL
29d0: 45 28 70 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d  E(pFile);.  rc =
29e0: 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
29f0: 2d 3e 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  ->xFileControl(p
2a00: 46 69 6c 65 2c 20 6f 70 2c 20 70 41 72 67 29 3b  File, op, pArg);
2a10: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2a20: 45 5f 4f 4b 20 26 26 20 6f 70 3d 3d 53 51 4c 49  E_OK && op==SQLI
2a30: 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45  TE_FCNTL_VFSNAME
2a40: 20 29 7b 0a 20 20 20 20 2a 28 63 68 61 72 2a 2a   ){.    *(char**
2a50: 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  )pArg = sqlite3_
2a60: 6d 70 72 69 6e 74 66 28 22 61 70 6e 64 28 25 6c  mprintf("apnd(%l
2a70: 6c 64 29 2f 25 7a 22 2c 20 70 2d 3e 69 50 67 4f  ld)/%z", p->iPgO
2a80: 6e 65 2c 20 2a 28 63 68 61 72 2a 2a 29 70 41 72  ne, *(char**)pAr
2a90: 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
2aa0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
2ab0: 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 2d  turn the sector-
2ac0: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 66 6f  size in bytes fo
2ad0: 72 20 61 6e 20 61 70 6e 64 2d 66 69 6c 65 2e 0a  r an apnd-file..
2ae0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70  */.static int ap
2af0: 6e 64 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  ndSectorSize(sql
2b00: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
2b10: 29 7b 0a 20 20 70 46 69 6c 65 20 3d 20 4f 52 49  ){.  pFile = ORI
2b20: 47 46 49 4c 45 28 70 46 69 6c 65 29 3b 0a 20 20  GFILE(pFile);.  
2b30: 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 4d  return pFile->pM
2b40: 65 74 68 6f 64 73 2d 3e 78 53 65 63 74 6f 72 53  ethods->xSectorS
2b50: 69 7a 65 28 70 46 69 6c 65 29 3b 0a 7d 0a 0a 2f  ize(pFile);.}../
2b60: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2b70: 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
2b80: 69 73 74 69 63 20 66 6c 61 67 73 20 73 75 70 70  istic flags supp
2b90: 6f 72 74 65 64 20 62 79 20 61 6e 20 61 70 6e 64  orted by an apnd
2ba0: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
2bb0: 20 69 6e 74 20 61 70 6e 64 44 65 76 69 63 65 43   int apndDeviceC
2bc0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
2bd0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
2be0: 6c 65 29 7b 0a 20 20 70 46 69 6c 65 20 3d 20 4f  le){.  pFile = O
2bf0: 52 49 47 46 49 4c 45 28 70 46 69 6c 65 29 3b 0a  RIGFILE(pFile);.
2c00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c10: 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45 20  IOCAP_IMMUTABLE 
2c20: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  |.           pFi
2c30: 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 44  le->pMethods->xD
2c40: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
2c50: 74 69 63 73 28 70 46 69 6c 65 29 3b 0a 7d 0a 0a  tics(pFile);.}..
2c60: 2f 2a 20 43 72 65 61 74 65 20 61 20 73 68 61 72  /* Create a shar
2c70: 65 64 20 6d 65 6d 6f 72 79 20 66 69 6c 65 20 6d  ed memory file m
2c80: 61 70 70 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63  apping */.static
2c90: 20 69 6e 74 20 61 70 6e 64 53 68 6d 4d 61 70 28   int apndShmMap(
2ca0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
2cb0: 2a 70 46 69 6c 65 2c 0a 20 20 69 6e 74 20 69 50  *pFile,.  int iP
2cc0: 67 2c 0a 20 20 69 6e 74 20 70 67 73 7a 2c 0a 20  g,.  int pgsz,. 
2cd0: 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 0a 20 20   int bExtend,.  
2ce0: 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a  void volatile **
2cf0: 70 70 0a 29 7b 0a 20 20 70 46 69 6c 65 20 3d 20  pp.){.  pFile = 
2d00: 4f 52 49 47 46 49 4c 45 28 70 46 69 6c 65 29 3b  ORIGFILE(pFile);
2d10: 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d  .  return pFile-
2d20: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d  >pMethods->xShmM
2d30: 61 70 28 70 46 69 6c 65 2c 69 50 67 2c 70 67 73  ap(pFile,iPg,pgs
2d40: 7a 2c 62 45 78 74 65 6e 64 2c 70 70 29 3b 0a 7d  z,bExtend,pp);.}
2d50: 0a 0a 2f 2a 20 50 65 72 66 6f 72 6d 20 6c 6f 63  ../* Perform loc
2d60: 6b 69 6e 67 20 6f 6e 20 61 20 73 68 61 72 65 64  king on a shared
2d70: 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20  -memory segment 
2d80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70  */.static int ap
2d90: 6e 64 53 68 6d 4c 6f 63 6b 28 73 71 6c 69 74 65  ndShmLock(sqlite
2da0: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
2db0: 6e 74 20 6f 66 66 73 65 74 2c 20 69 6e 74 20 6e  nt offset, int n
2dc0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
2dd0: 70 46 69 6c 65 20 3d 20 4f 52 49 47 46 49 4c 45  pFile = ORIGFILE
2de0: 28 70 46 69 6c 65 29 3b 0a 20 20 72 65 74 75 72  (pFile);.  retur
2df0: 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  n pFile->pMethod
2e00: 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 70 46 69 6c  s->xShmLock(pFil
2e10: 65 2c 6f 66 66 73 65 74 2c 6e 2c 66 6c 61 67 73  e,offset,n,flags
2e20: 29 3b 0a 7d 0a 0a 2f 2a 20 4d 65 6d 6f 72 79 20  );.}../* Memory 
2e30: 62 61 72 72 69 65 72 20 6f 70 65 72 61 74 69 6f  barrier operatio
2e40: 6e 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  n on shared memo
2e50: 72 79 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ry */.static voi
2e60: 64 20 61 70 6e 64 53 68 6d 42 61 72 72 69 65 72  d apndShmBarrier
2e70: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
2e80: 46 69 6c 65 29 7b 0a 20 20 70 46 69 6c 65 20 3d  File){.  pFile =
2e90: 20 4f 52 49 47 46 49 4c 45 28 70 46 69 6c 65 29   ORIGFILE(pFile)
2ea0: 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  ;.  pFile->pMeth
2eb0: 6f 64 73 2d 3e 78 53 68 6d 42 61 72 72 69 65 72  ods->xShmBarrier
2ec0: 28 70 46 69 6c 65 29 3b 0a 7d 0a 0a 2f 2a 20 55  (pFile);.}../* U
2ed0: 6e 6d 61 70 20 61 20 73 68 61 72 65 64 20 6d 65  nmap a shared me
2ee0: 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  mory segment */.
2ef0: 73 74 61 74 69 63 20 69 6e 74 20 61 70 6e 64 53  static int apndS
2f00: 68 6d 55 6e 6d 61 70 28 73 71 6c 69 74 65 33 5f  hmUnmap(sqlite3_
2f10: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
2f20: 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20   deleteFlag){.  
2f30: 70 46 69 6c 65 20 3d 20 4f 52 49 47 46 49 4c 45  pFile = ORIGFILE
2f40: 28 70 46 69 6c 65 29 3b 0a 20 20 72 65 74 75 72  (pFile);.  retur
2f50: 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  n pFile->pMethod
2f60: 73 2d 3e 78 53 68 6d 55 6e 6d 61 70 28 70 46 69  s->xShmUnmap(pFi
2f70: 6c 65 2c 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a  le,deleteFlag);.
2f80: 7d 0a 0a 2f 2a 20 46 65 74 63 68 20 61 20 70 61  }../* Fetch a pa
2f90: 67 65 20 6f 66 20 61 20 6d 65 6d 6f 72 79 2d 6d  ge of a memory-m
2fa0: 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 73 74  apped file */.st
2fb0: 61 74 69 63 20 69 6e 74 20 61 70 6e 64 46 65 74  atic int apndFet
2fc0: 63 68 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ch(.  sqlite3_fi
2fd0: 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20 73 71 6c  le *pFile,.  sql
2fe0: 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 73 74  ite3_int64 iOfst
2ff0: 2c 0a 20 20 69 6e 74 20 69 41 6d 74 2c 0a 20 20  ,.  int iAmt,.  
3000: 76 6f 69 64 20 2a 2a 70 70 0a 29 7b 0a 20 20 41  void **pp.){.  A
3010: 70 6e 64 46 69 6c 65 20 2a 70 20 3d 20 28 41 70  pndFile *p = (Ap
3020: 6e 64 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  ndFile *)pFile;.
3030: 20 20 70 46 69 6c 65 20 3d 20 4f 52 49 47 46 49    pFile = ORIGFI
3040: 4c 45 28 70 46 69 6c 65 29 3b 0a 20 20 72 65 74  LE(pFile);.  ret
3050: 75 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  urn pFile->pMeth
3060: 6f 64 73 2d 3e 78 46 65 74 63 68 28 70 46 69 6c  ods->xFetch(pFil
3070: 65 2c 20 69 4f 66 73 74 2b 70 2d 3e 69 50 67 4f  e, iOfst+p->iPgO
3080: 6e 65 2c 20 69 41 6d 74 2c 20 70 70 29 3b 0a 7d  ne, iAmt, pp);.}
3090: 0a 0a 2f 2a 20 52 65 6c 65 61 73 65 20 61 20 6d  ../* Release a m
30a0: 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 70 61 67  emory-mapped pag
30b0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
30c0: 61 70 6e 64 55 6e 66 65 74 63 68 28 73 71 6c 69  apndUnfetch(sqli
30d0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
30e0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
30f0: 4f 66 73 74 2c 20 76 6f 69 64 20 2a 70 50 61 67  Ofst, void *pPag
3100: 65 29 7b 0a 20 20 41 70 6e 64 46 69 6c 65 20 2a  e){.  ApndFile *
3110: 70 20 3d 20 28 41 70 6e 64 46 69 6c 65 20 2a 29  p = (ApndFile *)
3120: 70 46 69 6c 65 3b 0a 20 20 70 46 69 6c 65 20 3d  pFile;.  pFile =
3130: 20 4f 52 49 47 46 49 4c 45 28 70 46 69 6c 65 29   ORIGFILE(pFile)
3140: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65  ;.  return pFile
3150: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 55 6e 66  ->pMethods->xUnf
3160: 65 74 63 68 28 70 46 69 6c 65 2c 20 69 4f 66 73  etch(pFile, iOfs
3170: 74 2b 70 2d 3e 69 50 67 4f 6e 65 2c 20 70 50 61  t+p->iPgOne, pPa
3180: 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ge);.}../*.** Ch
3190: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
31a0: 65 20 66 69 6c 65 20 69 73 20 61 6e 20 6f 72 64  e file is an ord
31b0: 69 6e 61 72 79 20 53 51 4c 69 74 65 20 64 61 74  inary SQLite dat
31c0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  abase file..*/.s
31d0: 74 61 74 69 63 20 69 6e 74 20 61 70 6e 64 49 73  tatic int apndIs
31e0: 4f 72 64 69 6e 61 72 79 44 61 74 61 62 61 73 65  OrdinaryDatabase
31f0: 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 69 6e 74  File(sqlite3_int
3200: 36 34 20 73 7a 2c 20 73 71 6c 69 74 65 33 5f 66  64 sz, sqlite3_f
3210: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
3220: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 48  nt rc;.  char zH
3230: 64 72 5b 31 36 5d 3b 0a 20 20 73 74 61 74 69 63  dr[16];.  static
3240: 20 63 6f 6e 73 74 20 63 68 61 72 20 61 53 71 6c   const char aSql
3250: 69 74 65 48 64 72 5b 5d 20 3d 20 22 53 51 4c 69  iteHdr[] = "SQLi
3260: 74 65 20 66 6f 72 6d 61 74 20 33 22 3b 0a 20 20  te format 3";.  
3270: 69 66 28 20 73 7a 3c 35 31 32 20 29 20 72 65 74  if( sz<512 ) ret
3280: 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 46  urn 0;.  rc = pF
3290: 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  ile->pMethods->x
32a0: 52 65 61 64 28 70 46 69 6c 65 2c 20 7a 48 64 72  Read(pFile, zHdr
32b0: 2c 20 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20  , sizeof(zHdr), 
32c0: 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  0);.  if( rc ) r
32d0: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
32e0: 6e 20 6d 65 6d 63 6d 70 28 7a 48 64 72 2c 20 61  n memcmp(zHdr, a
32f0: 53 71 6c 69 74 65 48 64 72 2c 20 73 69 7a 65 6f  SqliteHdr, sizeo
3300: 66 28 7a 48 64 72 29 29 3d 3d 30 3b 0a 7d 0a 0a  f(zHdr))==0;.}..
3310: 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 72 65 61  /*.** Try to rea
3320: 64 20 74 68 65 20 61 70 70 65 6e 64 2d 6d 61 72  d the append-mar
3330: 6b 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  k off the end of
3340: 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e   a file.  Return
3350: 20 74 68 65 0a 2a 2a 20 73 74 61 72 74 20 6f 66   the.** start of
3360: 20 74 68 65 20 61 70 70 65 6e 64 65 64 20 64 61   the appended da
3370: 74 61 62 61 73 65 20 69 66 20 74 68 65 20 61 70  tabase if the ap
3380: 70 65 6e 64 2d 6d 61 72 6b 20 69 73 20 70 72 65  pend-mark is pre
3390: 73 65 6e 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  sent.  If.** the
33a0: 72 65 20 69 73 20 6e 6f 20 61 70 70 65 6e 64 2d  re is no append-
33b0: 6d 61 72 6b 2c 20 72 65 74 75 72 6e 20 2d 31 3b  mark, return -1;
33c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
33d0: 65 33 5f 69 6e 74 36 34 20 61 70 6e 64 52 65 61  e3_int64 apndRea
33e0: 64 4d 61 72 6b 28 73 71 6c 69 74 65 33 5f 69 6e  dMark(sqlite3_in
33f0: 74 36 34 20 73 7a 2c 20 73 71 6c 69 74 65 33 5f  t64 sz, sqlite3_
3400: 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
3410: 69 6e 74 20 72 63 2c 20 69 3b 0a 20 20 73 71 6c  int rc, i;.  sql
3420: 69 74 65 33 5f 69 6e 74 36 34 20 69 4d 61 72 6b  ite3_int64 iMark
3430: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
3440: 72 20 61 5b 41 50 4e 44 5f 4d 41 52 4b 5f 53 49  r a[APND_MARK_SI
3450: 5a 45 5d 3b 0a 0a 20 20 69 66 28 20 73 7a 3c 3d  ZE];..  if( sz<=
3460: 41 50 4e 44 5f 4d 41 52 4b 5f 53 49 5a 45 20 29  APND_MARK_SIZE )
3470: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 72 63   return -1;.  rc
3480: 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f   = pFile->pMetho
3490: 64 73 2d 3e 78 52 65 61 64 28 70 46 69 6c 65 2c  ds->xRead(pFile,
34a0: 20 61 2c 20 41 50 4e 44 5f 4d 41 52 4b 5f 53 49   a, APND_MARK_SI
34b0: 5a 45 2c 20 73 7a 2d 41 50 4e 44 5f 4d 41 52 4b  ZE, sz-APND_MARK
34c0: 5f 53 49 5a 45 29 3b 0a 20 20 69 66 28 20 72 63  _SIZE);.  if( rc
34d0: 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
34e0: 69 66 28 20 6d 65 6d 63 6d 70 28 61 2c 20 41 50  if( memcmp(a, AP
34f0: 4e 44 5f 4d 41 52 4b 5f 50 52 45 46 49 58 2c 20  ND_MARK_PREFIX, 
3500: 41 50 4e 44 5f 4d 41 52 4b 5f 50 52 45 46 49 58  APND_MARK_PREFIX
3510: 5f 53 5a 29 21 3d 30 20 29 20 72 65 74 75 72 6e  _SZ)!=0 ) return
3520: 20 2d 31 3b 0a 20 20 69 4d 61 72 6b 20 3d 20 28   -1;.  iMark = (
3530: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28  (sqlite3_int64)(
3540: 61 5b 41 50 4e 44 5f 4d 41 52 4b 5f 50 52 45 46  a[APND_MARK_PREF
3550: 49 58 5f 53 5a 5d 26 30 78 37 66 29 29 3c 3c 35  IX_SZ]&0x7f))<<5
3560: 36 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  6;.  for(i=1; i<
3570: 38 3b 20 69 2b 2b 29 7b 20 20 20 20 0a 20 20 20  8; i++){    .   
3580: 20 69 4d 61 72 6b 20 2b 3d 20 28 73 71 6c 69 74   iMark += (sqlit
3590: 65 33 5f 69 6e 74 36 34 29 61 5b 41 50 4e 44 5f  e3_int64)a[APND_
35a0: 4d 41 52 4b 5f 50 52 45 46 49 58 5f 53 5a 2b 69  MARK_PREFIX_SZ+i
35b0: 5d 3c 3c 28 35 36 2d 38 2a 69 29 3b 0a 20 20 7d  ]<<(56-8*i);.  }
35c0: 0a 20 20 72 65 74 75 72 6e 20 69 4d 61 72 6b 3b  .  return iMark;
35d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
35e0: 6e 20 61 70 6e 64 20 66 69 6c 65 20 68 61 6e 64  n apnd file hand
35f0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
3600: 74 20 61 70 6e 64 4f 70 65 6e 28 0a 20 20 73 71  t apndOpen(.  sq
3610: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
3620: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3630: 4e 61 6d 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f  Name,.  sqlite3_
3640: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20 69  file *pFile,.  i
3650: 6e 74 20 66 6c 61 67 73 2c 0a 20 20 69 6e 74 20  nt flags,.  int 
3660: 2a 70 4f 75 74 46 6c 61 67 73 0a 29 7b 0a 20 20  *pOutFlags.){.  
3670: 41 70 6e 64 46 69 6c 65 20 2a 70 3b 0a 20 20 73  ApndFile *p;.  s
3680: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 53 75  qlite3_file *pSu
3690: 62 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33  bFile;.  sqlite3
36a0: 5f 76 66 73 20 2a 70 53 75 62 56 66 73 3b 0a 20  _vfs *pSubVfs;. 
36b0: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
36c0: 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 70  e3_int64 sz;.  p
36d0: 53 75 62 56 66 73 20 3d 20 4f 52 49 47 56 46 53  SubVfs = ORIGVFS
36e0: 28 70 56 66 73 29 3b 0a 20 20 69 66 28 20 28 66  (pVfs);.  if( (f
36f0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
3700: 45 4e 5f 4d 41 49 4e 5f 44 42 29 3d 3d 30 20 29  EN_MAIN_DB)==0 )
3710: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 53 75  {.    return pSu
3720: 62 56 66 73 2d 3e 78 4f 70 65 6e 28 70 53 75 62  bVfs->xOpen(pSub
3730: 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 70 46 69 6c  Vfs, zName, pFil
3740: 65 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c  e, flags, pOutFl
3750: 61 67 73 29 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  ags);.  }.  p = 
3760: 28 41 70 6e 64 46 69 6c 65 2a 29 70 46 69 6c 65  (ApndFile*)pFile
3770: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
3780: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
3790: 70 2d 3e 62 61 73 65 2e 70 4d 65 74 68 6f 64 73  p->base.pMethods
37a0: 20 3d 20 26 61 70 6e 64 5f 69 6f 5f 6d 65 74 68   = &apnd_io_meth
37b0: 6f 64 73 3b 0a 20 20 70 53 75 62 46 69 6c 65 20  ods;.  pSubFile 
37c0: 3d 20 4f 52 49 47 46 49 4c 45 28 70 46 69 6c 65  = ORIGFILE(pFile
37d0: 29 3b 0a 20 20 72 63 20 3d 20 70 53 75 62 56 66  );.  rc = pSubVf
37e0: 73 2d 3e 78 4f 70 65 6e 28 70 53 75 62 56 66 73  s->xOpen(pSubVfs
37f0: 2c 20 7a 4e 61 6d 65 2c 20 70 53 75 62 46 69 6c  , zName, pSubFil
3800: 65 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c  e, flags, pOutFl
3810: 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ags);.  if( rc )
3820: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
3830: 20 3d 20 70 53 75 62 46 69 6c 65 2d 3e 70 4d 65   = pSubFile->pMe
3840: 74 68 6f 64 73 2d 3e 78 46 69 6c 65 53 69 7a 65  thods->xFileSize
3850: 28 70 53 75 62 46 69 6c 65 2c 20 26 73 7a 29 3b  (pSubFile, &sz);
3860: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
3870: 20 70 53 75 62 46 69 6c 65 2d 3e 70 4d 65 74 68   pSubFile->pMeth
3880: 6f 64 73 2d 3e 78 43 6c 6f 73 65 28 70 53 75 62  ods->xClose(pSub
3890: 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 72  File);.    retur
38a0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
38b0: 61 70 6e 64 49 73 4f 72 64 69 6e 61 72 79 44 61  apndIsOrdinaryDa
38c0: 74 61 62 61 73 65 46 69 6c 65 28 73 7a 2c 20 70  tabaseFile(sz, p
38d0: 53 75 62 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  SubFile) ){.    
38e0: 6d 65 6d 6d 6f 76 65 28 70 46 69 6c 65 2c 20 70  memmove(pFile, p
38f0: 53 75 62 46 69 6c 65 2c 20 70 53 75 62 56 66 73  SubFile, pSubVfs
3900: 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 20  ->szOsFile);.   
3910: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3920: 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 4d 61 72  K;.  }.  p->iMar
3930: 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 50 67 4f  k = 0;.  p->iPgO
3940: 6e 65 20 3d 20 61 70 6e 64 52 65 61 64 4d 61 72  ne = apndReadMar
3950: 6b 28 73 7a 2c 20 70 46 69 6c 65 29 3b 0a 20 20  k(sz, pFile);.  
3960: 69 66 28 20 70 2d 3e 69 50 67 4f 6e 65 3e 30 20  if( p->iPgOne>0 
3970: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
3980: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
3990: 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  f( (flags & SQLI
39a0: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3d  TE_OPEN_CREATE)=
39b0: 3d 30 20 29 7b 0a 20 20 20 20 70 53 75 62 46 69  =0 ){.    pSubFi
39c0: 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43  le->pMethods->xC
39d0: 6c 6f 73 65 28 70 53 75 62 46 69 6c 65 29 3b 0a  lose(pSubFile);.
39e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
39f0: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a  E_CANTOPEN;.  }.
3a00: 20 20 70 2d 3e 69 50 67 4f 6e 65 20 3d 20 28 73    p->iPgOne = (s
3a10: 7a 2b 30 78 66 66 66 29 20 26 20 7e 28 73 71 6c  z+0xfff) & ~(sql
3a20: 69 74 65 33 5f 69 6e 74 36 34 29 30 78 66 66 66  ite3_int64)0xfff
3a30: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
3a40: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
3a50: 6c 6c 20 6f 74 68 65 72 20 56 46 53 20 6d 65 74  ll other VFS met
3a60: 68 6f 64 73 20 61 72 65 20 70 61 73 73 2d 74 68  hods are pass-th
3a70: 72 75 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rus..*/.static i
3a80: 6e 74 20 61 70 6e 64 44 65 6c 65 74 65 28 73 71  nt apndDelete(sq
3a90: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
3aa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
3ab0: 74 68 2c 20 69 6e 74 20 64 69 72 53 79 6e 63 29  th, int dirSync)
3ac0: 7b 0a 20 20 72 65 74 75 72 6e 20 4f 52 49 47 56  {.  return ORIGV
3ad0: 46 53 28 70 56 66 73 29 2d 3e 78 44 65 6c 65 74  FS(pVfs)->xDelet
3ae0: 65 28 4f 52 49 47 56 46 53 28 70 56 66 73 29 2c  e(ORIGVFS(pVfs),
3af0: 20 7a 50 61 74 68 2c 20 64 69 72 53 79 6e 63 29   zPath, dirSync)
3b00: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61  ;.}.static int a
3b10: 70 6e 64 41 63 63 65 73 73 28 0a 20 20 73 71 6c  pndAccess(.  sql
3b20: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
3b30: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3b40: 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 6c 61  Path, .  int fla
3b50: 67 73 2c 20 0a 20 20 69 6e 74 20 2a 70 52 65 73  gs, .  int *pRes
3b60: 4f 75 74 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  Out.){.  return 
3b70: 4f 52 49 47 56 46 53 28 70 56 66 73 29 2d 3e 78  ORIGVFS(pVfs)->x
3b80: 41 63 63 65 73 73 28 4f 52 49 47 56 46 53 28 70  Access(ORIGVFS(p
3b90: 56 66 73 29 2c 20 7a 50 61 74 68 2c 20 66 6c 61  Vfs), zPath, fla
3ba0: 67 73 2c 20 70 52 65 73 4f 75 74 29 3b 0a 7d 0a  gs, pResOut);.}.
3bb0: 73 74 61 74 69 63 20 69 6e 74 20 61 70 6e 64 46  static int apndF
3bc0: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73  ullPathname(.  s
3bd0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
3be0: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
3bf0: 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 6e  *zPath, .  int n
3c00: 4f 75 74 2c 20 0a 20 20 63 68 61 72 20 2a 7a 4f  Out, .  char *zO
3c10: 75 74 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 4f  ut.){.  return O
3c20: 52 49 47 56 46 53 28 70 56 66 73 29 2d 3e 78 46  RIGVFS(pVfs)->xF
3c30: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 4f 52 49 47  ullPathname(ORIG
3c40: 56 46 53 28 70 56 66 73 29 2c 7a 50 61 74 68 2c  VFS(pVfs),zPath,
3c50: 6e 4f 75 74 2c 7a 4f 75 74 29 3b 0a 7d 0a 73 74  nOut,zOut);.}.st
3c60: 61 74 69 63 20 76 6f 69 64 20 2a 61 70 6e 64 44  atic void *apndD
3c70: 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
3c80: 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63  s *pVfs, const c
3c90: 68 61 72 20 2a 7a 50 61 74 68 29 7b 0a 20 20 72  har *zPath){.  r
3ca0: 65 74 75 72 6e 20 4f 52 49 47 56 46 53 28 70 56  eturn ORIGVFS(pV
3cb0: 66 73 29 2d 3e 78 44 6c 4f 70 65 6e 28 4f 52 49  fs)->xDlOpen(ORI
3cc0: 47 56 46 53 28 70 56 66 73 29 2c 20 7a 50 61 74  GVFS(pVfs), zPat
3cd0: 68 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  h);.}.static voi
3ce0: 64 20 61 70 6e 64 44 6c 45 72 72 6f 72 28 73 71  d apndDlError(sq
3cf0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
3d00: 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72   int nByte, char
3d10: 20 2a 7a 45 72 72 4d 73 67 29 7b 0a 20 20 4f 52   *zErrMsg){.  OR
3d20: 49 47 56 46 53 28 70 56 66 73 29 2d 3e 78 44 6c  IGVFS(pVfs)->xDl
3d30: 45 72 72 6f 72 28 4f 52 49 47 56 46 53 28 70 56  Error(ORIGVFS(pV
3d40: 66 73 29 2c 20 6e 42 79 74 65 2c 20 7a 45 72 72  fs), nByte, zErr
3d50: 4d 73 67 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Msg);.}.static v
3d60: 6f 69 64 20 28 2a 61 70 6e 64 44 6c 53 79 6d 28  oid (*apndDlSym(
3d70: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
3d80: 73 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73  s, void *p, cons
3d90: 74 20 63 68 61 72 20 2a 7a 53 79 6d 29 29 28 76  t char *zSym))(v
3da0: 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 4f  oid){.  return O
3db0: 52 49 47 56 46 53 28 70 56 66 73 29 2d 3e 78 44  RIGVFS(pVfs)->xD
3dc0: 6c 53 79 6d 28 4f 52 49 47 56 46 53 28 70 56 66  lSym(ORIGVFS(pVf
3dd0: 73 29 2c 20 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a  s), p, zSym);.}.
3de0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 6e 64  static void apnd
3df0: 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
3e00: 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20  vfs *pVfs, void 
3e10: 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 4f 52 49  *pHandle){.  ORI
3e20: 47 56 46 53 28 70 56 66 73 29 2d 3e 78 44 6c 43  GVFS(pVfs)->xDlC
3e30: 6c 6f 73 65 28 4f 52 49 47 56 46 53 28 70 56 66  lose(ORIGVFS(pVf
3e40: 73 29 2c 20 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a  s), pHandle);.}.
3e50: 73 74 61 74 69 63 20 69 6e 74 20 61 70 6e 64 52  static int apndR
3e60: 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
3e70: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
3e80: 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 42   nByte, char *zB
3e90: 75 66 4f 75 74 29 7b 0a 20 20 72 65 74 75 72 6e  ufOut){.  return
3ea0: 20 4f 52 49 47 56 46 53 28 70 56 66 73 29 2d 3e   ORIGVFS(pVfs)->
3eb0: 78 52 61 6e 64 6f 6d 6e 65 73 73 28 4f 52 49 47  xRandomness(ORIG
3ec0: 56 46 53 28 70 56 66 73 29 2c 20 6e 42 79 74 65  VFS(pVfs), nByte
3ed0: 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74  , zBufOut);.}.st
3ee0: 61 74 69 63 20 69 6e 74 20 61 70 6e 64 53 6c 65  atic int apndSle
3ef0: 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ep(sqlite3_vfs *
3f00: 70 56 66 73 2c 20 69 6e 74 20 6e 4d 69 63 72 6f  pVfs, int nMicro
3f10: 29 7b 0a 20 20 72 65 74 75 72 6e 20 4f 52 49 47  ){.  return ORIG
3f20: 56 46 53 28 70 56 66 73 29 2d 3e 78 53 6c 65 65  VFS(pVfs)->xSlee
3f30: 70 28 4f 52 49 47 56 46 53 28 70 56 66 73 29 2c  p(ORIGVFS(pVfs),
3f40: 20 6e 4d 69 63 72 6f 29 3b 0a 7d 0a 73 74 61 74   nMicro);.}.stat
3f50: 69 63 20 69 6e 74 20 61 70 6e 64 43 75 72 72 65  ic int apndCurre
3f60: 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76  ntTime(sqlite3_v
3f70: 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65  fs *pVfs, double
3f80: 20 2a 70 54 69 6d 65 4f 75 74 29 7b 0a 20 20 72   *pTimeOut){.  r
3f90: 65 74 75 72 6e 20 4f 52 49 47 56 46 53 28 70 56  eturn ORIGVFS(pV
3fa0: 66 73 29 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d  fs)->xCurrentTim
3fb0: 65 28 4f 52 49 47 56 46 53 28 70 56 66 73 29 2c  e(ORIGVFS(pVfs),
3fc0: 20 70 54 69 6d 65 4f 75 74 29 3b 0a 7d 0a 73 74   pTimeOut);.}.st
3fd0: 61 74 69 63 20 69 6e 74 20 61 70 6e 64 47 65 74  atic int apndGet
3fe0: 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
3ff0: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
4000: 20 61 2c 20 63 68 61 72 20 2a 62 29 7b 0a 20 20   a, char *b){.  
4010: 72 65 74 75 72 6e 20 4f 52 49 47 56 46 53 28 70  return ORIGVFS(p
4020: 56 66 73 29 2d 3e 78 47 65 74 4c 61 73 74 45 72  Vfs)->xGetLastEr
4030: 72 6f 72 28 4f 52 49 47 56 46 53 28 70 56 66 73  ror(ORIGVFS(pVfs
4040: 29 2c 20 61 2c 20 62 29 3b 0a 7d 0a 73 74 61 74  ), a, b);.}.stat
4050: 69 63 20 69 6e 74 20 61 70 6e 64 43 75 72 72 65  ic int apndCurre
4060: 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
4070: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73  te3_vfs *pVfs, s
4080: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 29  qlite3_int64 *p)
4090: 7b 0a 20 20 72 65 74 75 72 6e 20 4f 52 49 47 56  {.  return ORIGV
40a0: 46 53 28 70 56 66 73 29 2d 3e 78 43 75 72 72 65  FS(pVfs)->xCurre
40b0: 6e 74 54 69 6d 65 49 6e 74 36 34 28 4f 52 49 47  ntTimeInt64(ORIG
40c0: 56 46 53 28 70 56 66 73 29 2c 20 70 29 3b 0a 7d  VFS(pVfs), p);.}
40d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 6e 64  .static int apnd
40e0: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  SetSystemCall(. 
40f0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
4100: 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  fs,.  const char
4110: 20 2a 7a 4e 61 6d 65 2c 0a 20 20 73 71 6c 69 74   *zName,.  sqlit
4120: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
4130: 43 61 6c 6c 0a 29 7b 0a 20 20 72 65 74 75 72 6e  Call.){.  return
4140: 20 4f 52 49 47 56 46 53 28 70 56 66 73 29 2d 3e   ORIGVFS(pVfs)->
4150: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 4f  xSetSystemCall(O
4160: 52 49 47 56 46 53 28 70 56 66 73 29 2c 7a 4e 61  RIGVFS(pVfs),zNa
4170: 6d 65 2c 70 43 61 6c 6c 29 3b 0a 7d 0a 73 74 61  me,pCall);.}.sta
4180: 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63  tic sqlite3_sysc
4190: 61 6c 6c 5f 70 74 72 20 61 70 6e 64 47 65 74 53  all_ptr apndGetS
41a0: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
41b0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a  ite3_vfs *pVfs,.
41c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
41d0: 61 6d 65 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  ame.){.  return 
41e0: 4f 52 49 47 56 46 53 28 70 56 66 73 29 2d 3e 78  ORIGVFS(pVfs)->x
41f0: 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 4f 52  GetSystemCall(OR
4200: 49 47 56 46 53 28 70 56 66 73 29 2c 7a 4e 61 6d  IGVFS(pVfs),zNam
4210: 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e  e);.}.static con
4220: 73 74 20 63 68 61 72 20 2a 61 70 6e 64 4e 65 78  st char *apndNex
4230: 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69  tSystemCall(sqli
4240: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
4250: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
4260: 29 7b 0a 20 20 72 65 74 75 72 6e 20 4f 52 49 47  ){.  return ORIG
4270: 56 46 53 28 70 56 66 73 29 2d 3e 78 4e 65 78 74  VFS(pVfs)->xNext
4280: 53 79 73 74 65 6d 43 61 6c 6c 28 4f 52 49 47 56  SystemCall(ORIGV
4290: 46 53 28 70 56 66 73 29 2c 20 7a 4e 61 6d 65 29  FS(pVfs), zName)
42a0: 3b 0a 7d 0a 0a 20 20 0a 23 69 66 64 65 66 20 5f  ;.}..  .#ifdef _
42b0: 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63  WIN32.__declspec
42c0: 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64  (dllexport).#end
42d0: 69 66 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72  if./* .** This r
42e0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
42f0: 20 77 68 65 6e 20 74 68 65 20 65 78 74 65 6e 73   when the extens
4300: 69 6f 6e 20 69 73 20 6c 6f 61 64 65 64 2e 0a 2a  ion is loaded..*
4310: 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20 6e  * Register the n
4320: 65 77 20 56 46 53 2e 0a 2a 2f 0a 69 6e 74 20 73  ew VFS..*/.int s
4330: 71 6c 69 74 65 33 5f 61 70 70 65 6e 64 76 66 73  qlite3_appendvfs
4340: 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65 33  _init(.  sqlite3
4350: 20 2a 64 62 2c 20 0a 20 20 63 68 61 72 20 2a 2a   *db, .  char **
4360: 70 7a 45 72 72 4d 73 67 2c 20 0a 20 20 63 6f 6e  pzErrMsg, .  con
4370: 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
4380: 6f 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b  outines *pApi.){
4390: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
43a0: 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33  TE_OK;.  sqlite3
43b0: 5f 76 66 73 20 2a 70 4f 72 69 67 3b 0a 20 20 53  _vfs *pOrig;.  S
43c0: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
43d0: 49 4e 49 54 32 28 70 41 70 69 29 3b 0a 20 20 70  INIT2(pApi);.  p
43e0: 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 33 5f 76  Orig = sqlite3_v
43f0: 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 61 70  fs_find(0);.  ap
4400: 6e 64 5f 76 66 73 2e 69 56 65 72 73 69 6f 6e 20  nd_vfs.iVersion 
4410: 3d 20 70 4f 72 69 67 2d 3e 69 56 65 72 73 69 6f  = pOrig->iVersio
4420: 6e 3b 0a 20 20 61 70 6e 64 5f 76 66 73 2e 70 41  n;.  apnd_vfs.pA
4430: 70 70 44 61 74 61 20 3d 20 70 4f 72 69 67 3b 0a  ppData = pOrig;.
4440: 20 20 61 70 6e 64 5f 76 66 73 2e 73 7a 4f 73 46    apnd_vfs.szOsF
4450: 69 6c 65 20 3d 20 73 69 7a 65 6f 66 28 41 70 6e  ile = sizeof(Apn
4460: 64 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 73  dFile);.  rc = s
4470: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
4480: 74 65 72 28 26 61 70 6e 64 5f 76 66 73 2c 20 30  ter(&apnd_vfs, 0
4490: 29 3b 0a 23 69 66 64 65 66 20 41 50 50 45 4e 44  );.#ifdef APPEND
44a0: 56 46 53 5f 54 45 53 54 0a 20 20 69 66 28 20 72  VFS_TEST.  if( r
44b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
44c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
44d0: 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28  _auto_extension(
44e0: 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 61  (void(*)(void))a
44f0: 70 6e 64 76 66 73 52 65 67 69 73 74 65 72 29 3b  pndvfsRegister);
4500: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
4510: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4520: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
4530: 5f 4c 4f 41 44 5f 50 45 52 4d 41 4e 45 4e 54 4c  _LOAD_PERMANENTL
4540: 59 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  Y;.  return rc;.
4550: 7d 0a                                            }.