0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 41 70 72 69 6c /*.** 2008 April
0010: 20 31 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 10.**.** The au
0020: 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 thor disclaims c
0030: 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 opyright to this
0040: 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 source code. I
0050: 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 n place of.** a
0060: 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 legal notice, he
0070: 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 re is a blessing
0080: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 :.**.** May y
0090: 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e ou do good and n
00a0: 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d ot evil..** M
00b0: 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 ay you find forg
00c0: 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 iveness for your
00d0: 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 self and forgive
00e0: 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d others..** M
00f0: 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 ay you share fre
0100: 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e ely, never takin
0110: 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 g more than you
0120: 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a give..**.*******
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 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 *******.**.** Th
0180: 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 is file contains
0190: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 the implementat
01a0: 69 6f 6e 20 6f 66 20 61 6e 20 53 51 4c 69 74 65 ion of an SQLite
01b0: 20 76 66 73 20 77 72 61 70 70 65 72 20 74 68 61 vfs wrapper tha
01c0: 74 0a 2a 2a 20 61 64 64 73 20 69 6e 73 74 72 75 t.** adds instru
01d0: 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20 61 6c 6c mentation to all
01e0: 20 76 66 73 20 61 6e 64 20 66 69 6c 65 20 6d 65 vfs and file me
01f0: 74 68 6f 64 73 2e 20 43 20 61 6e 64 20 54 63 6c thods. C and Tcl
0200: 20 69 6e 74 65 72 66 61 63 65 73 0a 2a 2a 20 61 interfaces.** a
0210: 72 65 20 70 72 6f 76 69 64 65 64 20 74 6f 20 63 re provided to c
0220: 6f 6e 74 72 6f 6c 20 74 68 65 20 69 6e 73 74 72 ontrol the instr
0230: 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 0a umentation..*/..
0240: 2f 2a 0a 2a 2a 20 43 20 69 6e 74 65 72 66 61 63 /*.** C interfac
0250: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 e:.**.** sqlit
0260: 65 33 5f 69 6e 73 74 76 66 73 5f 63 72 65 61 74 e3_instvfs_creat
0270: 65 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 e().** sqlite3
0280: 5f 69 6e 73 74 76 66 73 5f 64 65 73 74 72 6f 79 _instvfs_destroy
0290: 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f ().** sqlite3_
02a0: 69 6e 73 74 76 66 73 5f 63 6f 6e 66 69 67 75 72 instvfs_configur
02b0: 65 28 29 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 e().**.** sqli
02c0: 74 65 33 5f 69 6e 73 74 76 66 73 5f 72 65 73 65 te3_instvfs_rese
02d0: 74 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 t().** sqlite3
02e0: 5f 69 6e 73 74 76 66 73 5f 67 65 74 28 29 0a 2a _instvfs_get().*
02f0: 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 69 *.** sqlite3_i
0300: 6e 73 74 76 66 73 5f 62 69 6e 61 72 79 6c 6f 67 nstvfs_binarylog
0310: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 69 6e .** sqlite3_in
0320: 73 74 76 66 73 5f 62 69 6e 61 72 79 6c 6f 67 5f stvfs_binarylog_
0330: 6d 61 72 6b 65 72 0a 2a 2a 0a 2a 2a 20 54 63 6c marker.**.** Tcl
0340: 20 69 6e 74 65 72 66 61 63 65 20 28 6f 6d 69 74 interface (omit
0350: 74 65 64 20 69 66 20 53 51 4c 49 54 45 5f 54 45 ted if SQLITE_TE
0360: 53 54 20 69 73 20 6e 6f 74 20 73 65 74 29 3a 0a ST is not set):.
0370: 2a 2a 20 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 ** .** sqlite3
0380: 5f 69 6e 73 74 76 66 73 20 63 72 65 61 74 65 20 _instvfs create
0390: 4e 41 4d 45 20 3f 50 41 52 45 4e 54 3f 0a 2a 2a NAME ?PARENT?.**
03a0: 0a 2a 2a 20 20 20 20 20 20 20 43 72 65 61 74 65 .** Create
03b0: 20 61 6e 64 20 72 65 67 69 73 74 65 72 20 6e 65 and register ne
03c0: 77 20 76 66 73 20 63 61 6c 6c 65 64 20 24 4e 41 w vfs called $NA
03d0: 4d 45 2c 20 77 68 69 63 68 20 69 73 20 61 20 77 ME, which is a w
03e0: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 0a 2a 2a rapper around.**
03f0: 20 20 20 20 20 20 20 74 68 65 20 65 78 69 73 74 the exist
0400: 69 6e 67 20 76 66 73 20 24 50 41 52 45 4e 54 2e ing vfs $PARENT.
0410: 20 49 66 20 74 68 65 20 50 41 52 45 4e 54 20 61 If the PARENT a
0420: 72 67 75 6d 65 6e 74 20 69 73 20 6f 6d 69 74 74 rgument is omitt
0430: 65 64 2c 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 ed, the.**
0440: 20 6e 65 77 20 76 66 73 20 69 73 20 61 20 77 72 new vfs is a wr
0450: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 apper around the
0460: 20 63 75 72 72 65 6e 74 20 64 65 66 61 75 6c 74 current default
0470: 20 76 66 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 73 71 vfs..**.** sq
0480: 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 20 64 65 lite3_instvfs de
0490: 73 74 72 6f 79 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a stroy NAME.**.**
04a0: 20 20 20 20 20 20 20 44 65 72 65 67 69 73 74 65 Deregiste
04b0: 72 20 61 6e 64 20 64 65 73 74 72 6f 79 20 74 68 r and destroy th
04c0: 65 20 76 66 73 20 6e 61 6d 65 64 20 24 4e 41 4d e vfs named $NAM
04d0: 45 2c 20 77 68 69 63 68 20 6d 75 73 74 20 68 61 E, which must ha
04e0: 76 65 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20 20 ve been.**
04f0: 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 65 created by an e
0500: 61 72 6c 69 65 72 20 69 6e 76 6f 63 61 74 69 6f arlier invocatio
0510: 6e 20 6f 66 20 5b 73 71 6c 69 74 65 33 5f 69 6e n of [sqlite3_in
0520: 73 74 76 66 73 20 63 72 65 61 74 65 5d 2e 0a 2a stvfs create]..*
0530: 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 69 *.** sqlite3_i
0540: 6e 73 74 76 66 73 20 63 6f 6e 66 69 67 75 72 65 nstvfs configure
0550: 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 2a 2a 0a NAME SCRIPT.**.
0560: 2a 2a 20 20 20 20 20 20 20 43 6f 6e 66 69 67 75 ** Configu
0570: 72 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 re the callback
0580: 73 63 72 69 70 74 20 66 6f 72 20 74 68 65 20 76 script for the v
0590: 66 73 20 24 4e 41 4d 45 2c 20 77 68 69 63 68 20 fs $NAME, which
05a0: 6d 75 63 68 20 68 61 76 65 0a 2a 2a 20 20 20 20 much have.**
05b0: 20 20 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 been created
05c0: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 69 6e by an earlier in
05d0: 76 6f 63 61 74 69 6f 6e 20 6f 66 20 5b 73 71 6c vocation of [sql
05e0: 69 74 65 33 5f 69 6e 73 74 76 66 73 20 63 72 65 ite3_instvfs cre
05f0: 61 74 65 5d 2e 0a 2a 2a 20 20 20 20 20 20 20 41 ate]..** A
0600: 66 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 fter a callback
0610: 73 63 72 69 70 74 20 68 61 73 20 62 65 65 6e 20 script has been
0620: 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 74 20 69 configured, it i
0630: 73 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 0a 2a s invoked each.*
0640: 2a 20 20 20 20 20 20 20 74 69 6d 65 20 61 20 76 * time a v
0650: 66 73 20 6f 72 20 66 69 6c 65 20 6d 65 74 68 6f fs or file metho
0660: 64 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 53 d is called by S
0670: 51 4c 69 74 65 2e 20 42 65 66 6f 72 65 20 69 6e QLite. Before in
0680: 76 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 voking.**
0690: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 the callback scr
06a0: 69 70 74 2c 20 66 69 76 65 20 61 72 67 75 6d 65 ipt, five argume
06b0: 6e 74 73 20 61 72 65 20 61 70 70 65 6e 64 65 64 nts are appended
06c0: 20 74 6f 20 69 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 to it:.**.**
06d0: 20 20 20 20 20 20 2a 20 54 68 65 20 6e 61 6d 65 * The name
06e0: 20 6f 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 of the invoked
06f0: 6d 65 74 68 6f 64 20 2d 20 69 2e 65 2e 20 22 78 method - i.e. "x
0700: 52 65 61 64 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 Read"..**.**
0710: 20 20 20 20 20 2a 20 54 68 65 20 74 69 6d 65 20 * The time
0720: 63 6f 6e 73 75 6d 65 64 20 62 79 20 74 68 65 20 consumed by the
0730: 6d 65 74 68 6f 64 20 63 61 6c 6c 20 61 73 20 6d method call as m
0740: 65 61 73 75 72 65 64 20 62 79 20 68 77 74 69 6d easured by hwtim
0750: 65 28 29 20 28 61 6e 0a 2a 2a 20 20 20 20 20 20 e() (an.**
0760: 20 20 20 20 20 69 6e 74 65 67 65 72 20 76 61 6c integer val
0770: 75 65 29 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 ue).**.**
0780: 20 20 2a 20 41 20 73 74 72 69 6e 67 20 76 61 6c * A string val
0790: 75 65 20 77 69 74 68 20 61 20 64 69 66 66 65 72 ue with a differ
07a0: 65 6e 74 20 6d 65 61 6e 69 6e 67 20 66 6f 72 20 ent meaning for
07b0: 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c 73 2e different calls.
07c0: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 46 .** F
07d0: 6f 72 20 66 69 6c 65 20 6d 65 74 68 6f 64 73 2c or file methods,
07e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 the name of the
07f0: 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 72 file being oper
0800: 61 74 65 64 20 6f 6e 2e 20 46 6f 72 0a 2a 2a 20 ated on. For.**
0810: 20 20 20 20 20 20 20 20 20 20 6f 74 68 65 72 20 other
0820: 6d 65 74 68 6f 64 73 20 69 74 20 69 73 20 74 68 methods it is th
0830: 65 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d e filename argum
0840: 65 6e 74 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a ent, if any..**.
0850: 2a 2a 20 20 20 20 20 20 20 20 20 2a 20 41 20 33 ** * A 3
0860: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 2-bit integer va
0870: 6c 75 65 20 77 69 74 68 20 61 20 63 61 6c 6c 2d lue with a call-
0880: 73 70 65 63 69 66 69 63 20 6d 65 61 6e 69 6e 67 specific meaning
0890: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 ..**.**
08a0: 2a 20 41 20 36 34 2d 62 69 74 20 69 6e 74 65 67 * A 64-bit integ
08b0: 65 72 20 76 61 6c 75 65 2e 20 46 6f 72 20 78 52 er value. For xR
08c0: 65 61 64 28 29 20 61 6e 64 20 78 57 72 69 74 65 ead() and xWrite
08d0: 28 29 20 63 61 6c 6c 73 20 74 68 69 73 0a 2a 2a () calls this.**
08e0: 20 20 20 20 20 20 20 20 20 20 20 69 73 20 74 68 is th
08f0: 65 20 66 69 6c 65 20 6f 66 66 73 65 74 20 62 65 e file offset be
0900: 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 6f ing written to o
0910: 72 20 72 65 61 64 20 66 72 6f 6d 2e 20 55 6e 75 r read from. Unu
0920: 73 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 sed by.**
0930: 20 20 20 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 all other ca
0940: 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c lls..**.** sql
0950: 69 74 65 33 5f 69 6e 73 74 76 66 73 20 72 65 73 ite3_instvfs res
0960: 65 74 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 20 20 et NAME.**.**
0970: 20 20 20 20 5a 65 72 6f 20 74 68 65 20 69 6e 74 Zero the int
0980: 65 72 6e 61 6c 20 65 76 65 6e 74 20 63 6f 75 6e ernal event coun
0990: 74 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 ters associated
09a0: 77 69 74 68 20 76 66 73 20 24 4e 41 4d 45 2c 20 with vfs $NAME,
09b0: 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 63 68 20 .** which
09c0: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 63 must have been c
09d0: 72 65 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 reated by an ear
09e0: 6c 69 65 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 lier invocation
09f0: 6f 66 20 0a 2a 2a 20 20 20 20 20 20 20 5b 73 71 of .** [sq
0a00: 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 20 63 72 lite3_instvfs cr
0a10: 65 61 74 65 5d 2e 0a 2a 2a 0a 2a 2a 20 20 20 73 eate]..**.** s
0a20: 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 20 72 qlite3_instvfs r
0a30: 65 70 6f 72 74 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a eport NAME.**.**
0a40: 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 74 68 Return th
0a50: 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 e values of the
0a60: 69 6e 74 65 72 6e 61 6c 20 65 76 65 6e 74 20 63 internal event c
0a70: 6f 75 6e 74 65 72 73 20 61 73 73 6f 63 69 61 74 ounters associat
0a80: 65 64 20 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 ed .** wit
0a90: 68 20 76 66 73 20 24 4e 41 4d 45 2e 20 54 68 65 h vfs $NAME. The
0aa0: 20 72 65 70 6f 72 74 20 66 6f 72 6d 61 74 20 69 report format i
0ab0: 73 20 61 20 6c 69 73 74 20 77 69 74 68 20 6f 6e s a list with on
0ac0: 65 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 e element.**
0ad0: 20 20 20 66 6f 72 20 65 61 63 68 20 6d 65 74 68 for each meth
0ae0: 6f 64 20 63 61 6c 6c 20 28 78 57 72 69 74 65 2c od call (xWrite,
0af0: 20 78 52 65 61 64 20 65 74 63 2e 29 2e 20 45 61 xRead etc.). Ea
0b00: 63 68 20 65 6c 65 6d 65 6e 74 20 69 73 0a 2a 2a ch element is.**
0b10: 20 20 20 20 20 20 20 69 74 73 65 6c 66 20 61 20 itself a
0b20: 6c 69 73 74 20 77 69 74 68 20 74 68 72 65 65 20 list with three
0b30: 65 6c 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 elements:.**.**
0b40: 20 20 20 20 20 20 20 20 2a 20 54 68 65 20 6e 61 * The na
0b50: 6d 65 20 6f 66 20 74 68 65 20 6d 65 74 68 6f 64 me of the method
0b60: 20 63 61 6c 6c 20 2d 20 69 2e 65 2e 20 22 78 57 call - i.e. "xW
0b70: 72 69 74 65 22 2c 0a 2a 2a 20 20 20 20 20 20 20 rite",.**
0b80: 20 20 2a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 * The total nu
0b90: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f mber of calls to
0ba0: 20 74 68 65 20 6d 65 74 68 6f 64 20 28 61 6e 20 the method (an
0bb0: 69 6e 74 65 67 65 72 29 2e 0a 2a 2a 20 20 20 20 integer)..**
0bc0: 20 20 20 20 20 2a 20 54 68 65 20 61 67 67 72 65 * The aggre
0bd0: 67 61 74 65 20 74 69 6d 65 20 63 6f 6e 73 75 6d gate time consum
0be0: 65 64 20 62 79 20 61 6c 6c 20 63 61 6c 6c 73 20 ed by all calls
0bf0: 74 6f 20 74 68 65 20 6d 65 74 68 6f 64 20 61 73 to the method as
0c00: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6d 65 .** me
0c10: 61 73 75 72 65 64 20 62 79 20 68 77 74 69 6d 65 asured by hwtime
0c20: 28 29 20 28 61 6e 20 69 6e 74 65 67 65 72 29 2e () (an integer).
0c30: 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73 .*/..#include "s
0c40: 71 6c 69 74 65 33 2e 68 22 0a 23 69 6e 63 6c 75 qlite3.h".#inclu
0c50: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 de <string.h>.#i
0c60: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 nclude <assert.h
0c70: 3e 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d >../*.** Maximum
0c80: 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 pathname length
0c90: 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 74 68 supported by th
0ca0: 65 20 69 6e 73 74 20 62 61 63 6b 65 6e 64 2e 0a e inst backend..
0cb0: 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4e 53 54 5f */.#define INST_
0cc0: 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 MAX_PATHNAME 512
0cd0: 0a 0a 0a 2f 2a 20 46 69 6c 65 20 6d 65 74 68 6f .../* File metho
0ce0: 64 73 20 2a 2f 0a 2f 2a 20 56 66 73 20 6d 65 74 ds */./* Vfs met
0cf0: 68 6f 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 hods */.#define
0d00: 4f 53 5f 41 43 43 45 53 53 20 20 20 20 20 20 20 OS_ACCESS
0d10: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 4f 1.#define O
0d20: 53 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c S_CHECKRESERVEDL
0d30: 4f 43 4b 20 32 0a 23 64 65 66 69 6e 65 20 4f 53 OCK 2.#define OS
0d40: 5f 43 4c 4f 53 45 20 20 20 20 20 20 20 20 20 20 _CLOSE
0d50: 20 20 20 33 0a 23 64 65 66 69 6e 65 20 4f 53 5f 3.#define OS_
0d60: 43 55 52 52 45 4e 54 54 49 4d 45 20 20 20 20 20 CURRENTTIME
0d70: 20 20 34 0a 23 64 65 66 69 6e 65 20 4f 53 5f 44 4.#define OS_D
0d80: 45 4c 45 54 45 20 20 20 20 20 20 20 20 20 20 20 ELETE
0d90: 20 35 0a 23 64 65 66 69 6e 65 20 4f 53 5f 44 45 5.#define OS_DE
0da0: 56 43 48 41 52 20 20 20 20 20 20 20 20 20 20 20 VCHAR
0db0: 36 0a 23 64 65 66 69 6e 65 20 4f 53 5f 46 49 4c 6.#define OS_FIL
0dc0: 45 43 4f 4e 54 52 4f 4c 20 20 20 20 20 20 20 37 ECONTROL 7
0dd0: 0a 23 64 65 66 69 6e 65 20 4f 53 5f 46 49 4c 45 .#define OS_FILE
0de0: 53 49 5a 45 20 20 20 20 20 20 20 20 20 20 38 0a SIZE 8.
0df0: 23 64 65 66 69 6e 65 20 4f 53 5f 46 55 4c 4c 50 #define OS_FULLP
0e00: 41 54 48 4e 41 4d 45 20 20 20 20 20 20 39 0a 23 ATHNAME 9.#
0e10: 64 65 66 69 6e 65 20 4f 53 5f 47 45 54 54 45 4d define OS_GETTEM
0e20: 50 4e 41 4d 45 20 20 20 20 20 20 20 31 30 0a 23 PNAME 10.#
0e30: 64 65 66 69 6e 65 20 4f 53 5f 4c 4f 43 4b 20 20 define OS_LOCK
0e40: 20 20 20 20 20 20 20 20 20 20 20 20 31 31 0a 23 11.#
0e50: 64 65 66 69 6e 65 20 4f 53 5f 4f 50 45 4e 20 20 define OS_OPEN
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 31 32 0a 23 12.#
0e70: 64 65 66 69 6e 65 20 4f 53 5f 52 41 4e 44 4f 4d define OS_RANDOM
0e80: 4e 45 53 53 20 20 20 20 20 20 20 20 31 33 0a 23 NESS 13.#
0e90: 64 65 66 69 6e 65 20 4f 53 5f 52 45 41 44 20 20 define OS_READ
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 31 34 20 0a 14 .
0eb0: 23 64 65 66 69 6e 65 20 4f 53 5f 53 45 43 54 4f #define OS_SECTO
0ec0: 52 53 49 5a 45 20 20 20 20 20 20 20 20 31 35 0a RSIZE 15.
0ed0: 23 64 65 66 69 6e 65 20 4f 53 5f 53 4c 45 45 50 #define OS_SLEEP
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 36 0a 16.
0ef0: 23 64 65 66 69 6e 65 20 4f 53 5f 53 59 4e 43 20 #define OS_SYNC
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 37 0a 17.
0f10: 23 64 65 66 69 6e 65 20 4f 53 5f 54 52 55 4e 43 #define OS_TRUNC
0f20: 41 54 45 20 20 20 20 20 20 20 20 20 20 31 38 0a ATE 18.
0f30: 23 64 65 66 69 6e 65 20 4f 53 5f 55 4e 4c 4f 43 #define OS_UNLOC
0f40: 4b 20 20 20 20 20 20 20 20 20 20 20 20 31 39 0a K 19.
0f50: 23 64 65 66 69 6e 65 20 4f 53 5f 57 52 49 54 45 #define OS_WRITE
0f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30 0a 20.
0f70: 0a 23 64 65 66 69 6e 65 20 4f 53 5f 4e 55 4d 45 .#define OS_NUME
0f80: 56 45 4e 54 53 20 20 20 20 20 20 20 20 20 32 31 VENTS 21
0f90: 0a 0a 23 64 65 66 69 6e 65 20 42 49 4e 41 52 59 ..#define BINARY
0fa0: 4c 4f 47 5f 53 54 52 49 4e 47 20 20 20 20 20 33 LOG_STRING 3
0fb0: 30 0a 23 64 65 66 69 6e 65 20 42 49 4e 41 52 59 0.#define BINARY
0fc0: 4c 4f 47 5f 4d 41 52 4b 45 52 20 20 20 20 20 33 LOG_MARKER 3
0fd0: 31 0a 0a 73 74 72 75 63 74 20 49 6e 73 74 56 66 1..struct InstVf
0fe0: 73 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 s {. sqlite3_vf
0ff0: 73 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 s base;. sqlite
1000: 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 0a 20 20 3_vfs *pVfs;..
1010: 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 3b 0a 20 void *pClient;.
1020: 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f void (*xDel)(vo
1030: 69 64 20 2a 29 3b 0a 20 20 76 6f 69 64 20 28 2a id *);. void (*
1040: 78 43 61 6c 6c 29 28 76 6f 69 64 20 2a 2c 20 69 xCall)(void *, i
1050: 6e 74 2c 20 69 6e 74 2c 20 73 71 6c 69 74 65 33 nt, int, sqlite3
1060: 5f 69 6e 74 36 34 2c 20 69 6e 74 2c 20 63 6f 6e _int64, int, con
1070: 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20 st char *, int,
1080: 69 6e 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 int, sqlite3_int
1090: 36 34 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 64);.. /* Count
10a0: 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 ers */. sqlite3
10b0: 5f 69 6e 74 36 34 20 61 54 69 6d 65 5b 4f 53 5f _int64 aTime[OS_
10c0: 4e 55 4d 45 56 45 4e 54 53 5d 3b 0a 20 20 69 6e NUMEVENTS];. in
10d0: 74 20 61 43 6f 75 6e 74 5b 4f 53 5f 4e 55 4d 45 t aCount[OS_NUME
10e0: 56 45 4e 54 53 5d 3b 0a 0a 20 20 69 6e 74 20 69 VENTS];.. int i
10f0: 4e 65 78 74 46 69 6c 65 49 64 3b 0a 7d 3b 0a 74 NextFileId;.};.t
1100: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49 6e ypedef struct In
1110: 73 74 56 66 73 20 49 6e 73 74 56 66 73 3b 0a 0a stVfs InstVfs;..
1120: 23 64 65 66 69 6e 65 20 52 45 41 4c 56 46 53 28 #define REALVFS(
1130: 70 29 20 28 28 28 49 6e 73 74 56 66 73 20 2a 29 p) (((InstVfs *)
1140: 28 70 29 29 2d 3e 70 56 66 73 29 0a 0a 74 79 70 (p))->pVfs)..typ
1150: 65 64 65 66 20 73 74 72 75 63 74 20 69 6e 73 74 edef struct inst
1160: 5f 66 69 6c 65 20 69 6e 73 74 5f 66 69 6c 65 3b _file inst_file;
1170: 0a 73 74 72 75 63 74 20 69 6e 73 74 5f 66 69 6c .struct inst_fil
1180: 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 e {. sqlite3_fi
1190: 6c 65 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 le base;. sqlit
11a0: 65 33 5f 66 69 6c 65 20 2a 70 52 65 61 6c 3b 0a e3_file *pReal;.
11b0: 20 20 49 6e 73 74 56 66 73 20 2a 70 49 6e 73 74 InstVfs *pInst
11c0: 56 66 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 Vfs;. const cha
11d0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 r *zName;. int
11e0: 69 46 69 6c 65 49 64 3b 20 20 20 20 20 20 20 20 iFileId;
11f0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 69 /* File i
1200: 64 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e d number */. in
1210: 74 20 66 6c 61 67 73 3b 0a 7d 3b 0a 0a 2f 2a 0a t flags;.};../*.
1220: 2a 2a 20 4d 65 74 68 6f 64 20 64 65 63 6c 61 72 ** Method declar
1230: 61 74 69 6f 6e 73 20 66 6f 72 20 69 6e 73 74 5f ations for inst_
1240: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 file..*/.static
1250: 69 6e 74 20 69 6e 73 74 43 6c 6f 73 65 28 73 71 int instClose(sq
1260: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 lite3_file*);.st
1270: 61 74 69 63 20 69 6e 74 20 69 6e 73 74 52 65 61 atic int instRea
1280: 64 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c d(sqlite3_file*,
1290: 20 76 6f 69 64 2a 2c 20 69 6e 74 20 69 41 6d 74 void*, int iAmt
12a0: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 , sqlite3_int64
12b0: 69 4f 66 73 74 29 3b 0a 73 74 61 74 69 63 20 69 iOfst);.static i
12c0: 6e 74 20 69 6e 73 74 57 72 69 74 65 28 73 71 6c nt instWrite(sql
12d0: 69 74 65 33 5f 66 69 6c 65 2a 2c 63 6f 6e 73 74 ite3_file*,const
12e0: 20 76 6f 69 64 2a 2c 69 6e 74 20 69 41 6d 74 2c void*,int iAmt,
12f0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 sqlite3_int64 i
1300: 4f 66 73 74 29 3b 0a 73 74 61 74 69 63 20 69 6e Ofst);.static in
1310: 74 20 69 6e 73 74 54 72 75 6e 63 61 74 65 28 73 t instTruncate(s
1320: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71 qlite3_file*, sq
1330: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 69 7a 65 lite3_int64 size
1340: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e );.static int in
1350: 73 74 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 stSync(sqlite3_f
1360: 69 6c 65 2a 2c 20 69 6e 74 20 66 6c 61 67 73 29 ile*, int flags)
1370: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 ;.static int ins
1380: 74 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 tFileSize(sqlite
1390: 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 3_file*, sqlite3
13a0: 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 3b 0a _int64 *pSize);.
13b0: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 4c static int instL
13c0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 ock(sqlite3_file
13d0: 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 *, int);.static
13e0: 69 6e 74 20 69 6e 73 74 55 6e 6c 6f 63 6b 28 73 int instUnlock(s
13f0: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e qlite3_file*, in
1400: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 t);.static int i
1410: 6e 73 74 43 68 65 63 6b 52 65 73 65 72 76 65 64 nstCheckReserved
1420: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c Lock(sqlite3_fil
1430: 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 e*);.static int
1440: 69 6e 73 74 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 instFileControl(
1450: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 sqlite3_file*, i
1460: 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 nt op, void *pAr
1470: 67 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 g);.static int i
1480: 6e 73 74 53 65 63 74 6f 72 53 69 7a 65 28 73 71 nstSectorSize(sq
1490: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 lite3_file*);.st
14a0: 61 74 69 63 20 69 6e 74 20 69 6e 73 74 44 65 76 atic int instDev
14b0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 iceCharacteristi
14c0: 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a cs(sqlite3_file*
14d0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65 74 68 6f 64 );../*.** Method
14e0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f declarations fo
14f0: 72 20 69 6e 73 74 5f 76 66 73 2e 0a 2a 2f 0a 73 r inst_vfs..*/.s
1500: 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 4f 70 tatic int instOp
1510: 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c en(sqlite3_vfs*,
1520: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 73 const char *, s
1530: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e qlite3_file*, in
1540: 74 20 2c 20 69 6e 74 20 2a 29 3b 0a 73 74 61 74 t , int *);.stat
1550: 69 63 20 69 6e 74 20 69 6e 73 74 44 65 6c 65 74 ic int instDelet
1560: 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 e(sqlite3_vfs*,
1570: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d const char *zNam
1580: 65 2c 20 69 6e 74 20 73 79 6e 63 44 69 72 29 3b e, int syncDir);
1590: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 .static int inst
15a0: 41 63 63 65 73 73 28 73 71 6c 69 74 65 33 5f 76 Access(sqlite3_v
15b0: 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 fs*, const char
15c0: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 66 6c 61 67 *zName, int flag
15d0: 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 s);.static int i
15e0: 6e 73 74 47 65 74 54 65 6d 70 4e 61 6d 65 28 73 nstGetTempName(s
15f0: 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74 qlite3_vfs*, int
1600: 20 6e 4f 75 74 2c 20 63 68 61 72 20 2a 7a 4f 75 nOut, char *zOu
1610: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 t);.static int i
1620: 6e 73 74 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 nstFullPathname(
1630: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f sqlite3_vfs*, co
1640: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c nst char *zName,
1650: 20 69 6e 74 2c 20 63 68 61 72 20 2a 7a 4f 75 74 int, char *zOut
1660: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a );.static void *
1670: 69 6e 73 74 44 6c 4f 70 65 6e 28 73 71 6c 69 74 instDlOpen(sqlit
1680: 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 e3_vfs*, const c
1690: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 3b har *zFilename);
16a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 .static void ins
16b0: 74 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 tDlError(sqlite3
16c0: 5f 76 66 73 2a 2c 20 69 6e 74 20 6e 42 79 74 65 _vfs*, int nByte
16d0: 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 29 , char *zErrMsg)
16e0: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 69 ;.static void *i
16f0: 6e 73 74 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 nstDlSym(sqlite3
1700: 5f 76 66 73 2a 2c 76 6f 69 64 2a 2c 20 63 6f 6e _vfs*,void*, con
1710: 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c st char *zSymbol
1720: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 );.static void i
1730: 6e 73 74 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 nstDlClose(sqlit
1740: 65 33 5f 76 66 73 2a 2c 20 76 6f 69 64 2a 29 3b e3_vfs*, void*);
1750: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 .static int inst
1760: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 Randomness(sqlit
1770: 65 33 5f 76 66 73 2a 2c 20 69 6e 74 20 6e 42 79 e3_vfs*, int nBy
1780: 74 65 2c 20 63 68 61 72 20 2a 7a 4f 75 74 29 3b te, char *zOut);
1790: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 .static int inst
17a0: 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 Sleep(sqlite3_vf
17b0: 73 2a 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 s*, int microsec
17c0: 6f 6e 64 73 29 3b 0a 73 74 61 74 69 63 20 69 6e onds);.static in
17d0: 74 20 69 6e 73 74 43 75 72 72 65 6e 74 54 69 6d t instCurrentTim
17e0: 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 e(sqlite3_vfs*,
17f0: 64 6f 75 62 6c 65 2a 29 3b 0a 0a 73 74 61 74 69 double*);..stati
1800: 63 20 76 6f 69 64 20 62 69 6e 61 72 79 6c 6f 67 c void binarylog
1810: 5f 62 6c 6f 62 28 73 71 6c 69 74 65 33 5f 76 66 _blob(sqlite3_vf
1820: 73 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 s *, const char
1830: 2a 2c 20 69 6e 74 29 3b 20 0a 0a 73 74 61 74 69 *, int); ..stati
1840: 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 69 6e c sqlite3_vfs in
1850: 73 74 5f 76 66 73 20 3d 20 7b 0a 20 20 31 2c 20 st_vfs = {. 1,
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1870: 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e /* iVersion
1880: 20 2a 2f 0a 20 20 73 69 7a 65 6f 66 28 69 6e 73 */. sizeof(ins
1890: 74 5f 66 69 6c 65 29 2c 20 20 20 20 20 20 2f 2a t_file), /*
18a0: 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 49 szOsFile */. I
18b0: 4e 53 54 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45 NST_MAX_PATHNAME
18c0: 2c 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 , /* mxPath
18d0: 6e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 name */. 0,
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18f0: 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 /* pNext */.
1900: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
1910: 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 /* zName
1920: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 */. 0,
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1940: 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 69 pAppData */. i
1950: 6e 73 74 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 nstOpen,
1960: 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 /* xOpen
1970: 2a 2f 0a 20 20 69 6e 73 74 44 65 6c 65 74 65 2c */. instDelete,
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1990: 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 73 xDelete */. ins
19a0: 74 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 tAccess,
19b0: 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 /* xAccess
19c0: 2a 2f 0a 20 20 69 6e 73 74 47 65 74 54 65 6d 70 */. instGetTemp
19d0: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 Name, /*
19e0: 78 47 65 74 54 65 6d 70 4e 61 6d 65 20 2a 2f 0a xGetTempName */.
19f0: 20 20 69 6e 73 74 46 75 6c 6c 50 61 74 68 6e 61 instFullPathna
1a00: 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 78 46 75 me, /* xFu
1a10: 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 llPathname */.
1a20: 69 6e 73 74 44 6c 4f 70 65 6e 2c 20 20 20 20 20 instDlOpen,
1a30: 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 /* xDlOp
1a40: 65 6e 20 2a 2f 0a 20 20 69 6e 73 74 44 6c 45 72 en */. instDlEr
1a50: 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 ror,
1a60: 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 /* xDlError */.
1a70: 20 69 6e 73 74 44 6c 53 79 6d 2c 20 20 20 20 20 instDlSym,
1a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 /* xDlS
1a90: 79 6d 20 2a 2f 0a 20 20 69 6e 73 74 44 6c 43 6c ym */. instDlCl
1aa0: 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 ose,
1ab0: 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 /* xDlClose */.
1ac0: 20 69 6e 73 74 52 61 6e 64 6f 6d 6e 65 73 73 2c instRandomness,
1ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e /* xRan
1ae0: 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 73 domness */. ins
1af0: 74 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 tSleep,
1b00: 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a /* xSleep *
1b10: 2f 0a 20 20 69 6e 73 74 43 75 72 72 65 6e 74 54 /. instCurrentT
1b20: 69 6d 65 20 20 20 20 20 20 20 20 20 2f 2a 20 78 ime /* x
1b30: 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 7d CurrentTime */.}
1b40: 3b 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 ;..static sqlite
1b50: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 69 6e 73 3_io_methods ins
1b60: 74 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 3d 20 7b t_io_methods = {
1b70: 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 . 1,
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b90: 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a /* iVersion */.
1ba0: 20 20 69 6e 73 74 43 6c 6f 73 65 2c 20 20 20 20 instClose,
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1bc0: 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 /* xClose */.
1bd0: 20 69 6e 73 74 52 65 61 64 2c 20 20 20 20 20 20 instRead,
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1bf0: 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 69 /* xRead */. i
1c00: 6e 73 74 57 72 69 74 65 2c 20 20 20 20 20 20 20 nstWrite,
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1c20: 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 69 6e * xWrite */. in
1c30: 73 74 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 stTruncate,
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1c50: 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 xTruncate */.
1c60: 69 6e 73 74 53 79 6e 63 2c 20 20 20 20 20 20 20 instSync,
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c80: 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 69 6e /* xSync */. in
1c90: 73 74 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 stFileSize,
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1cb0: 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 xFileSize */.
1cc0: 69 6e 73 74 4c 6f 63 6b 2c 20 20 20 20 20 20 20 instLock,
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ce0: 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 69 6e /* xLock */. in
1cf0: 73 74 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 stUnlock,
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1d10: 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e xUnlock */. in
1d20: 73 74 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c stCheckReservedL
1d30: 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 2f 2a ock, /*
1d40: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c xCheckReservedL
1d50: 6f 63 6b 20 2a 2f 0a 20 20 69 6e 73 74 46 69 6c ock */. instFil
1d60: 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 eControl,
1d70: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c /* xFil
1d80: 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 69 6e eControl */. in
1d90: 73 74 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 stSectorSize,
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1db0: 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a xSectorSize */.
1dc0: 20 20 69 6e 73 74 44 65 76 69 63 65 43 68 61 72 instDeviceChar
1dd0: 61 63 74 65 72 69 73 74 69 63 73 20 20 20 20 20 acteristics
1de0: 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 /* xDeviceChar
1df0: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 7d acteristics */.}
1e00: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c ;../*.** The fol
1e10: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 6f lowing routine o
1e20: 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 70 65 6e nly works on pen
1e30: 74 69 75 6d 2d 63 6c 61 73 73 20 70 72 6f 63 65 tium-class proce
1e40: 73 73 6f 72 73 2e 0a 2a 2a 20 49 74 20 75 73 65 ssors..** It use
1e50: 73 20 74 68 65 20 52 44 54 53 43 20 6f 70 63 6f s the RDTSC opco
1e60: 64 65 20 74 6f 20 72 65 61 64 20 74 68 65 20 63 de to read the c
1e70: 79 63 6c 65 20 63 6f 75 6e 74 20 76 61 6c 75 65 ycle count value
1e80: 20 6f 75 74 20 6f 66 20 74 68 65 0a 2a 2a 20 70 out of the.** p
1e90: 72 6f 63 65 73 73 6f 72 20 61 6e 64 20 72 65 74 rocessor and ret
1ea0: 75 72 6e 73 20 74 68 61 74 20 76 61 6c 75 65 2e urns that value.
1eb0: 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 This can be us
1ec0: 65 64 20 66 6f 72 20 68 69 67 68 2d 72 65 73 0a ed for high-res.
1ed0: 2a 2a 20 70 72 6f 66 69 6c 69 6e 67 2e 0a 2a 2f ** profiling..*/
1ee0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 69 33 38 .#if defined(i38
1ef0: 36 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 6) || defined(__
1f00: 69 33 38 36 5f 5f 29 20 7c 7c 20 64 65 66 69 6e i386__) || defin
1f10: 65 64 28 5f 4d 5f 49 58 38 36 29 0a 5f 5f 69 6e ed(_M_IX86).__in
1f20: 6c 69 6e 65 5f 5f 20 75 6e 73 69 67 6e 65 64 20 line__ unsigned
1f30: 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74 20 6f 73 long long int os
1f40: 69 6e 73 74 5f 68 77 74 69 6d 65 28 76 6f 69 64 inst_hwtime(void
1f50: 29 7b 0a 20 20 20 75 6e 73 69 67 6e 65 64 20 69 ){. unsigned i
1f60: 6e 74 20 6c 6f 2c 20 68 69 3b 0a 20 20 20 2f 2a nt lo, hi;. /*
1f70: 20 57 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 22 We cannot use "
1f80: 3d 41 22 2c 20 73 69 6e 63 65 20 74 68 69 73 20 =A", since this
1f90: 77 6f 75 6c 64 20 75 73 65 20 25 72 61 78 20 6f would use %rax o
1fa0: 6e 20 78 38 36 5f 36 34 20 2a 2f 0a 20 20 20 5f n x86_64 */. _
1fb0: 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c _asm__ __volatil
1fc0: 65 5f 5f 20 28 22 72 64 74 73 63 22 20 3a 20 22 e__ ("rdtsc" : "
1fd0: 3d 61 22 20 28 6c 6f 29 2c 20 22 3d 64 22 20 28 =a" (lo), "=d" (
1fe0: 68 69 29 29 3b 0a 20 20 20 72 65 74 75 72 6e 20 hi));. return
1ff0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c (unsigned long l
2000: 6f 6e 67 20 69 6e 74 29 68 69 20 3c 3c 20 33 32 ong int)hi << 32
2010: 20 7c 20 6c 6f 3b 0a 7d 0a 23 65 6c 73 65 0a 20 | lo;.}.#else.
2020: 20 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 static unsigned
2030: 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74 20 6f long long int o
2040: 73 69 6e 73 74 5f 68 77 74 69 6d 65 28 76 6f 69 sinst_hwtime(voi
2050: 64 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 0a d){ return 0; }.
2060: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 #endif..#define
2070: 4f 53 5f 54 49 4d 45 5f 49 4f 28 65 45 76 65 6e OS_TIME_IO(eEven
2080: 74 2c 20 41 2c 20 42 2c 20 43 61 6c 6c 29 20 7b t, A, B, Call) {
2090: 20 20 20 20 20 5c 0a 20 20 69 6e 73 74 5f 66 69 \. inst_fi
20a0: 6c 65 20 2a 70 20 3d 20 28 69 6e 73 74 5f 66 69 le *p = (inst_fi
20b0: 6c 65 20 2a 29 70 46 69 6c 65 3b 20 20 20 20 20 le *)pFile;
20c0: 20 20 20 20 5c 0a 20 20 49 6e 73 74 56 66 73 20 \. InstVfs
20d0: 2a 70 49 6e 73 74 56 66 73 20 3d 20 70 2d 3e 70 *pInstVfs = p->p
20e0: 49 6e 73 74 56 66 73 3b 20 20 20 20 20 20 20 20 InstVfs;
20f0: 20 20 20 5c 0a 20 20 69 6e 74 20 72 63 3b 20 20 \. int rc;
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2120: 20 20 5c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e \. sqlite3_in
2130: 74 36 34 20 74 20 3d 20 6f 73 69 6e 73 74 5f 68 t64 t = osinst_h
2140: 77 74 69 6d 65 28 29 3b 20 20 20 20 20 20 20 20 wtime();
2150: 20 5c 0a 20 20 72 63 20 3d 20 43 61 6c 6c 3b 20 \. rc = Call;
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2180: 5c 0a 20 20 74 20 3d 20 6f 73 69 6e 73 74 5f 68 \. t = osinst_h
2190: 77 74 69 6d 65 28 29 20 2d 20 74 3b 20 20 20 20 wtime() - t;
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c \
21b0: 0a 20 20 70 49 6e 73 74 56 66 73 2d 3e 61 54 69 . pInstVfs->aTi
21c0: 6d 65 5b 65 45 76 65 6e 74 5d 20 2b 3d 20 74 3b me[eEvent] += t;
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a \.
21e0: 20 20 70 49 6e 73 74 56 66 73 2d 3e 61 43 6f 75 pInstVfs->aCou
21f0: 6e 74 5b 65 45 76 65 6e 74 5d 20 2b 3d 20 31 3b nt[eEvent] += 1;
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 \.
2210: 20 69 66 28 20 70 49 6e 73 74 56 66 73 2d 3e 78 if( pInstVfs->x
2220: 43 61 6c 6c 20 29 7b 20 20 20 20 20 20 20 20 20 Call ){
2230: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 \.
2240: 20 20 70 49 6e 73 74 56 66 73 2d 3e 78 43 61 6c pInstVfs->xCal
2250: 6c 28 20 20 20 20 20 20 20 20 20 20 20 20 20 20 l(
2260: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 \.
2270: 20 20 20 70 49 6e 73 74 56 66 73 2d 3e 70 43 6c pInstVfs->pCl
2280: 69 65 6e 74 2c 65 45 76 65 6e 74 2c 70 2d 3e 69 ient,eEvent,p->i
2290: 46 69 6c 65 49 64 2c 74 2c 72 63 2c 70 2d 3e 7a FileId,t,rc,p->z
22a0: 4e 61 6d 65 2c 70 2d 3e 66 6c 61 67 73 2c 41 2c Name,p->flags,A,
22b0: 42 20 20 5c 0a 20 20 20 20 29 3b 20 20 20 20 20 B \. );
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
22e0: 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20 20 20 \. }
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2310: 20 5c 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 \. return rc;
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2340: 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4f 53 5f \.}..#define OS_
2350: 54 49 4d 45 5f 56 46 53 28 65 45 76 65 6e 74 2c TIME_VFS(eEvent,
2360: 20 5a 2c 20 66 6c 61 67 73 2c 20 41 2c 20 42 2c Z, flags, A, B,
2370: 20 43 61 6c 6c 29 20 7b 20 20 20 20 20 20 5c 0a Call) { \.
2380: 20 20 49 6e 73 74 56 66 73 20 2a 70 49 6e 73 74 InstVfs *pInst
2390: 56 66 73 20 3d 20 28 49 6e 73 74 56 66 73 20 2a Vfs = (InstVfs *
23a0: 29 70 56 66 73 3b 20 20 20 5c 0a 20 20 69 6e 74 )pVfs; \. int
23b0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 rc;
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23d0: 20 20 20 20 5c 0a 20 20 73 71 6c 69 74 65 33 5f \. sqlite3_
23e0: 69 6e 74 36 34 20 74 20 3d 20 6f 73 69 6e 73 74 int64 t = osinst
23f0: 5f 68 77 74 69 6d 65 28 29 3b 20 20 20 20 20 5c _hwtime(); \
2400: 0a 20 20 72 63 20 3d 20 43 61 6c 6c 3b 20 20 20 . rc = Call;
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2420: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 74 20 \. t
2430: 3d 20 6f 73 69 6e 73 74 5f 68 77 74 69 6d 65 28 = osinst_hwtime(
2440: 29 20 2d 20 74 3b 20 20 20 20 20 20 20 20 20 20 ) - t;
2450: 20 20 20 20 20 5c 0a 20 20 70 49 6e 73 74 56 66 \. pInstVf
2460: 73 2d 3e 61 54 69 6d 65 5b 65 45 76 65 6e 74 5d s->aTime[eEvent]
2470: 20 2b 3d 20 74 3b 20 20 20 20 20 20 20 20 20 20 += t;
2480: 5c 0a 20 20 70 49 6e 73 74 56 66 73 2d 3e 61 43 \. pInstVfs->aC
2490: 6f 75 6e 74 5b 65 45 76 65 6e 74 5d 20 2b 3d 20 ount[eEvent] +=
24a0: 31 3b 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 1; \. i
24b0: 66 28 20 70 49 6e 73 74 56 66 73 2d 3e 78 43 61 f( pInstVfs->xCa
24c0: 6c 6c 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 ll ){
24d0: 20 20 20 20 20 20 5c 0a 20 20 20 20 70 49 6e 73 \. pIns
24e0: 74 56 66 73 2d 3e 78 43 61 6c 6c 28 70 49 6e 73 tVfs->xCall(pIns
24f0: 74 56 66 73 2d 3e 70 43 6c 69 65 6e 74 2c 65 45 tVfs->pClient,eE
2500: 76 65 6e 74 2c 30 2c 20 74 2c 20 72 63 2c 20 5a vent,0, t, rc, Z
2510: 2c 20 66 6c 61 67 73 2c 20 41 2c 20 42 29 3b 20 , flags, A, B);
2520: 5c 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 \. }
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2540: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72 \. r
2550: 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20 eturn rc;
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2570: 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a \.}../*.**
2580: 20 43 6c 6f 73 65 20 61 6e 20 69 6e 73 74 2d 66 Close an inst-f
2590: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 ile..*/.static i
25a0: 6e 74 20 69 6e 73 74 43 6c 6f 73 65 28 73 71 6c nt instClose(sql
25b0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 ite3_file *pFile
25c0: 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 ){. OS_TIME_IO(
25d0: 4f 53 5f 43 4c 4f 53 45 2c 20 30 2c 20 30 2c 20 OS_CLOSE, 0, 0,
25e0: 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f p->pReal->pMetho
25f0: 64 73 2d 3e 78 43 6c 6f 73 65 28 70 2d 3e 70 52 ds->xClose(p->pR
2600: 65 61 6c 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 eal));.}../*.**
2610: 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 Read data from a
2620: 6e 20 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a n inst-file..*/.
2630: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 52 static int instR
2640: 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 ead(. sqlite3_f
2650: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 76 ile *pFile, . v
2660: 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e oid *zBuf, . in
2670: 74 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 t iAmt, . sqlit
2680: 65 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b e_int64 iOfst.){
2690: 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 . OS_TIME_IO(OS
26a0: 5f 52 45 41 44 2c 20 69 41 6d 74 2c 20 69 4f 66 _READ, iAmt, iOf
26b0: 73 74 2c 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d st, p->pReal->pM
26c0: 65 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 2d ethods->xRead(p-
26d0: 3e 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41 >pReal, zBuf, iA
26e0: 6d 74 2c 20 69 4f 66 73 74 29 29 3b 0a 7d 0a 0a mt, iOfst));.}..
26f0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 /*.** Write data
2700: 20 74 6f 20 61 6e 20 69 6e 73 74 2d 66 69 6c 65 to an inst-file
2710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
2720: 69 6e 73 74 57 72 69 74 65 28 0a 20 20 73 71 6c instWrite(. sql
2730: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 ite3_file *pFile
2740: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a ,. const void *
2750: 7a 2c 0a 20 20 69 6e 74 20 69 41 6d 74 2c 0a 20 z,. int iAmt,.
2760: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f sqlite_int64 iO
2770: 66 73 74 0a 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 fst.){. OS_TIME
2780: 5f 49 4f 28 4f 53 5f 57 52 49 54 45 2c 20 69 41 _IO(OS_WRITE, iA
2790: 6d 74 2c 20 69 4f 66 73 74 2c 20 70 2d 3e 70 52 mt, iOfst, p->pR
27a0: 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 eal->pMethods->x
27b0: 57 72 69 74 65 28 70 2d 3e 70 52 65 61 6c 2c 20 Write(p->pReal,
27c0: 7a 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 29 z, iAmt, iOfst))
27d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 ;.}../*.** Trunc
27e0: 61 74 65 20 61 6e 20 69 6e 73 74 2d 66 69 6c 65 ate an inst-file
27f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
2800: 69 6e 73 74 54 72 75 6e 63 61 74 65 28 73 71 6c instTruncate(sql
2810: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 ite3_file *pFile
2820: 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 , sqlite_int64 s
2830: 69 7a 65 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f ize){. OS_TIME_
2840: 49 4f 28 4f 53 5f 54 52 55 4e 43 41 54 45 2c 20 IO(OS_TRUNCATE,
2850: 30 2c 20 73 69 7a 65 2c 20 70 2d 3e 70 52 65 61 0, size, p->pRea
2860: 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 54 72 l->pMethods->xTr
2870: 75 6e 63 61 74 65 28 70 2d 3e 70 52 65 61 6c 2c uncate(p->pReal,
2880: 20 73 69 7a 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a size));.}../*.*
2890: 2a 20 53 79 6e 63 20 61 6e 20 69 6e 73 74 2d 66 * Sync an inst-f
28a0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 ile..*/.static i
28b0: 6e 74 20 69 6e 73 74 53 79 6e 63 28 73 71 6c 69 nt instSync(sqli
28c0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c te3_file *pFile,
28d0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 4f int flags){. O
28e0: 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f 53 59 4e S_TIME_IO(OS_SYN
28f0: 43 2c 20 66 6c 61 67 73 2c 20 30 2c 20 70 2d 3e C, flags, 0, p->
2900: 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d pReal->pMethods-
2910: 3e 78 53 79 6e 63 28 70 2d 3e 70 52 65 61 6c 2c >xSync(p->pReal,
2920: 20 66 6c 61 67 73 29 29 3b 0a 7d 0a 0a 2f 2a 0a flags));.}../*.
2930: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 ** Return the cu
2940: 72 72 65 6e 74 20 66 69 6c 65 2d 73 69 7a 65 20 rrent file-size
2950: 6f 66 20 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e of an inst-file.
2960: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 .*/.static int i
2970: 6e 73 74 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 nstFileSize(sqli
2980: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c te3_file *pFile,
2990: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 sqlite_int64 *p
29a0: 53 69 7a 65 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 Size){. OS_TIME
29b0: 5f 49 4f 28 4f 53 5f 46 49 4c 45 53 49 5a 45 2c _IO(OS_FILESIZE,
29c0: 20 28 69 6e 74 29 28 2a 70 53 69 7a 65 29 2c 20 (int)(*pSize),
29d0: 30 2c 20 0a 20 20 20 20 70 2d 3e 70 52 65 61 6c 0, . p->pReal
29e0: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c ->pMethods->xFil
29f0: 65 53 69 7a 65 28 70 2d 3e 70 52 65 61 6c 2c 20 eSize(p->pReal,
2a00: 70 53 69 7a 65 29 0a 20 20 29 3b 0a 7d 0a 0a 2f pSize). );.}../
2a10: 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 6e 20 69 6e 73 *.** Lock an ins
2a20: 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 t-file..*/.stati
2a30: 63 20 69 6e 74 20 69 6e 73 74 4c 6f 63 6b 28 73 c int instLock(s
2a40: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 qlite3_file *pFi
2a50: 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a le, int eLock){.
2a60: 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f OS_TIME_IO(OS_
2a70: 4c 4f 43 4b 2c 20 65 4c 6f 63 6b 2c 20 30 2c 20 LOCK, eLock, 0,
2a80: 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f p->pReal->pMetho
2a90: 64 73 2d 3e 78 4c 6f 63 6b 28 70 2d 3e 70 52 65 ds->xLock(p->pRe
2aa0: 61 6c 2c 20 65 4c 6f 63 6b 29 29 3b 0a 7d 0a 0a al, eLock));.}..
2ab0: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6e 20 /*.** Unlock an
2ac0: 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 inst-file..*/.st
2ad0: 61 74 69 63 20 69 6e 74 20 69 6e 73 74 55 6e 6c atic int instUnl
2ae0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 ock(sqlite3_file
2af0: 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f *pFile, int eLo
2b00: 63 6b 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 ck){. OS_TIME_I
2b10: 4f 28 4f 53 5f 55 4e 4c 4f 43 4b 2c 20 65 4c 6f O(OS_UNLOCK, eLo
2b20: 63 6b 2c 20 30 2c 20 70 2d 3e 70 52 65 61 6c 2d ck, 0, p->pReal-
2b30: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 55 6e 6c 6f >pMethods->xUnlo
2b40: 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f ck(p->pReal, eLo
2b50: 63 6b 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 ck));.}../*.** C
2b60: 68 65 63 6b 20 69 66 20 61 6e 6f 74 68 65 72 20 heck if another
2b70: 66 69 6c 65 2d 68 61 6e 64 6c 65 20 68 6f 6c 64 file-handle hold
2b80: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 s a RESERVED loc
2b90: 6b 20 6f 6e 20 61 6e 20 69 6e 73 74 2d 66 69 6c k on an inst-fil
2ba0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 e..*/.static int
2bb0: 20 69 6e 73 74 43 68 65 63 6b 52 65 73 65 72 76 instCheckReserv
2bc0: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 edLock(sqlite3_f
2bd0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 4f ile *pFile){. O
2be0: 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f 43 48 45 S_TIME_IO(OS_CHE
2bf0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 2c 20 CKRESERVEDLOCK,
2c00: 30 2c 20 30 2c 20 70 2d 3e 70 52 65 61 6c 2d 3e 0, 0, p->pReal->
2c10: 70 4d 65 74 68 6f 64 73 2d 3e 78 43 68 65 63 6b pMethods->xCheck
2c20: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 2d 3e ReservedLock(p->
2c30: 70 52 65 61 6c 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a pReal));.}../*.*
2c40: 2a 20 46 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 6d * File control m
2c50: 65 74 68 6f 64 2e 20 46 6f 72 20 63 75 73 74 6f ethod. For custo
2c60: 6d 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 m operations on
2c70: 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f an inst-file..*/
2c80: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 .static int inst
2c90: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 FileControl(sqli
2ca0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c te3_file *pFile,
2cb0: 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 int op, void *p
2cc0: 41 72 67 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f Arg){. OS_TIME_
2cd0: 49 4f 28 4f 53 5f 46 49 4c 45 43 4f 4e 54 52 4f IO(OS_FILECONTRO
2ce0: 4c 2c 20 30 2c 20 30 2c 20 70 2d 3e 70 52 65 61 L, 0, 0, p->pRea
2cf0: 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 l->pMethods->xFi
2d00: 6c 65 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 leControl(p->pRe
2d10: 61 6c 2c 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a al, op, pArg));.
2d20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 }../*.** Return
2d30: 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 the sector-size
2d40: 69 6e 20 62 79 74 65 73 20 66 6f 72 20 61 6e 20 in bytes for an
2d50: 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 inst-file..*/.st
2d60: 61 74 69 63 20 69 6e 74 20 69 6e 73 74 53 65 63 atic int instSec
2d70: 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f torSize(sqlite3_
2d80: 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 file *pFile){.
2d90: 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f 53 45 OS_TIME_IO(OS_SE
2da0: 43 54 4f 52 53 49 5a 45 2c 20 30 2c 20 30 2c 20 CTORSIZE, 0, 0,
2db0: 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f p->pReal->pMetho
2dc0: 64 73 2d 3e 78 53 65 63 74 6f 72 53 69 7a 65 28 ds->xSectorSize(
2dd0: 70 2d 3e 70 52 65 61 6c 29 29 3b 0a 7d 0a 0a 2f p->pReal));.}../
2de0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 *.** Return the
2df0: 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 device character
2e00: 69 73 74 69 63 20 66 6c 61 67 73 20 73 75 70 70 istic flags supp
2e10: 6f 72 74 65 64 20 62 79 20 61 6e 20 69 6e 73 74 orted by an inst
2e20: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 -file..*/.static
2e30: 20 69 6e 74 20 69 6e 73 74 44 65 76 69 63 65 43 int instDeviceC
2e40: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 haracteristics(s
2e50: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 qlite3_file *pFi
2e60: 6c 65 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 le){. OS_TIME_I
2e70: 4f 28 4f 53 5f 44 45 56 43 48 41 52 2c 20 30 2c O(OS_DEVCHAR, 0,
2e80: 20 30 2c 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 0, p->pReal->pM
2e90: 65 74 68 6f 64 73 2d 3e 78 44 65 76 69 63 65 43 ethods->xDeviceC
2ea0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 haracteristics(p
2eb0: 2d 3e 70 52 65 61 6c 29 29 3b 0a 7d 0a 0a 2f 2a ->pReal));.}../*
2ec0: 0a 2a 2a 20 4f 70 65 6e 20 61 6e 20 69 6e 73 74 .** Open an inst
2ed0: 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f file handle..*/
2ee0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 .static int inst
2ef0: 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f Open(. sqlite3_
2f00: 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e vfs *pVfs,. con
2f10: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a st char *zName,.
2f20: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a sqlite3_file *
2f30: 70 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66 6c 61 pFile,. int fla
2f40: 67 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 gs,. int *pOutF
2f50: 6c 61 67 73 0a 29 7b 0a 20 20 69 6e 73 74 5f 66 lags.){. inst_f
2f60: 69 6c 65 20 2a 70 20 3d 20 28 69 6e 73 74 5f 66 ile *p = (inst_f
2f70: 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 70 ile *)pFile;. p
2f80: 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 3d File->pMethods =
2f90: 20 26 69 6e 73 74 5f 69 6f 5f 6d 65 74 68 6f 64 &inst_io_method
2fa0: 73 3b 0a 20 20 70 2d 3e 70 52 65 61 6c 20 3d 20 s;. p->pReal =
2fb0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 (sqlite3_file *)
2fc0: 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e 70 49 6e 73 &p[1];. p->pIns
2fd0: 74 56 66 73 20 3d 20 28 49 6e 73 74 56 66 73 20 tVfs = (InstVfs
2fe0: 2a 29 70 56 66 73 3b 0a 20 20 70 2d 3e 7a 4e 61 *)pVfs;. p->zNa
2ff0: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 2d me = zName;. p-
3000: 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a >flags = flags;.
3010: 20 20 70 2d 3e 69 46 69 6c 65 49 64 20 3d 20 2b p->iFileId = +
3020: 2b 70 2d 3e 70 49 6e 73 74 56 66 73 2d 3e 69 4e +p->pInstVfs->iN
3030: 65 78 74 46 69 6c 65 49 64 3b 0a 0a 20 20 62 69 extFileId;.. bi
3040: 6e 61 72 79 6c 6f 67 5f 62 6c 6f 62 28 70 56 66 narylog_blob(pVf
3050: 73 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 s, zName, -1);.
3060: 20 4f 53 5f 54 49 4d 45 5f 56 46 53 28 4f 53 5f OS_TIME_VFS(OS_
3070: 4f 50 45 4e 2c 20 7a 4e 61 6d 65 2c 20 66 6c 61 OPEN, zName, fla
3080: 67 73 2c 20 70 2d 3e 69 46 69 6c 65 49 64 2c 20 gs, p->iFileId,
3090: 30 2c 0a 20 20 20 20 52 45 41 4c 56 46 53 28 70 0,. REALVFS(p
30a0: 56 66 73 29 2d 3e 78 4f 70 65 6e 28 52 45 41 4c Vfs)->xOpen(REAL
30b0: 56 46 53 28 70 56 66 73 29 2c 20 7a 4e 61 6d 65 VFS(pVfs), zName
30c0: 2c 20 70 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67 , p->pReal, flag
30d0: 73 2c 20 70 4f 75 74 46 6c 61 67 73 29 0a 20 20 s, pOutFlags).
30e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 );.}../*.** Dele
30f0: 74 65 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 61 te the file loca
3100: 74 65 64 20 61 74 20 7a 50 61 74 68 2e 20 49 66 ted at zPath. If
3110: 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67 the dirSync arg
3120: 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 0a 2a ument is true,.*
3130: 2a 20 65 6e 73 75 72 65 20 74 68 65 20 66 69 6c * ensure the fil
3140: 65 2d 73 79 73 74 65 6d 20 6d 6f 64 69 66 69 63 e-system modific
3150: 61 74 69 6f 6e 73 20 61 72 65 20 73 79 6e 63 65 ations are synce
3160: 64 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 d to disk before
3170: 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a .** returning..*
3180: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 /.static int ins
3190: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f tDelete(sqlite3_
31a0: 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 vfs *pVfs, const
31b0: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e char *zPath, in
31c0: 74 20 64 69 72 53 79 6e 63 29 7b 0a 20 20 62 69 t dirSync){. bi
31d0: 6e 61 72 79 6c 6f 67 5f 62 6c 6f 62 28 70 56 66 narylog_blob(pVf
31e0: 73 2c 20 7a 50 61 74 68 2c 20 2d 31 29 3b 0a 20 s, zPath, -1);.
31f0: 20 4f 53 5f 54 49 4d 45 5f 56 46 53 28 4f 53 5f OS_TIME_VFS(OS_
3200: 44 45 4c 45 54 45 2c 20 7a 50 61 74 68 2c 20 30 DELETE, zPath, 0
3210: 2c 20 64 69 72 53 79 6e 63 2c 20 30 2c 0a 20 20 , dirSync, 0,.
3220: 20 20 52 45 41 4c 56 46 53 28 70 56 66 73 29 2d REALVFS(pVfs)-
3230: 3e 78 44 65 6c 65 74 65 28 52 45 41 4c 56 46 53 >xDelete(REALVFS
3240: 28 70 56 66 73 29 2c 20 7a 50 61 74 68 2c 20 64 (pVfs), zPath, d
3250: 69 72 53 79 6e 63 29 20 0a 20 20 29 3b 0a 7d 0a irSync) . );.}.
3260: 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 66 6f 72 20 ./*.** Test for
3270: 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f access permissio
3280: 6e 73 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20 ns. Return true
3290: 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 if the requested
32a0: 20 70 65 72 6d 69 73 73 69 6f 6e 0a 2a 2a 20 69 permission.** i
32b0: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 s available, or
32c0: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e false otherwise.
32d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 .*/.static int i
32e0: 6e 73 74 41 63 63 65 73 73 28 73 71 6c 69 74 65 nstAccess(sqlite
32f0: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 3_vfs *pVfs, con
3300: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 st char *zPath,
3310: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 62 69 int flags){. bi
3320: 6e 61 72 79 6c 6f 67 5f 62 6c 6f 62 28 70 56 66 narylog_blob(pVf
3330: 73 2c 20 7a 50 61 74 68 2c 20 2d 31 29 3b 0a 20 s, zPath, -1);.
3340: 20 4f 53 5f 54 49 4d 45 5f 56 46 53 28 4f 53 5f OS_TIME_VFS(OS_
3350: 41 43 43 45 53 53 2c 20 7a 50 61 74 68 2c 20 30 ACCESS, zPath, 0
3360: 2c 20 66 6c 61 67 73 2c 20 30 2c 20 0a 20 20 20 , flags, 0, .
3370: 20 52 45 41 4c 56 46 53 28 70 56 66 73 29 2d 3e REALVFS(pVfs)->
3380: 78 41 63 63 65 73 73 28 52 45 41 4c 56 46 53 28 xAccess(REALVFS(
3390: 70 56 66 73 29 2c 20 7a 50 61 74 68 2c 20 66 6c pVfs), zPath, fl
33a0: 61 67 73 29 20 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a ags) . );.}../*
33b0: 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 62 75 66 .** Populate buf
33c0: 66 65 72 20 7a 42 75 66 4f 75 74 20 77 69 74 68 fer zBufOut with
33d0: 20 61 20 70 61 74 68 6e 61 6d 65 20 73 75 69 74 a pathname suit
33e0: 61 62 6c 65 20 66 6f 72 20 75 73 65 20 61 73 20 able for use as
33f0: 61 20 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 a .** temporary
3400: 66 69 6c 65 2e 20 7a 42 75 66 4f 75 74 20 69 73 file. zBufOut is
3410: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 70 guaranteed to p
3420: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 oint to a buffer
3430: 20 6f 66 20 0a 2a 2a 20 61 74 20 6c 65 61 73 74 of .** at least
3440: 20 28 49 4e 53 54 5f 4d 41 58 5f 50 41 54 48 4e (INST_MAX_PATHN
3450: 41 4d 45 2b 31 29 20 62 79 74 65 73 2e 0a 2a 2f AME+1) bytes..*/
3460: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 .static int inst
3470: 47 65 74 54 65 6d 70 4e 61 6d 65 28 73 71 6c 69 GetTempName(sqli
3480: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 te3_vfs *pVfs, i
3490: 6e 74 20 6e 4f 75 74 2c 20 63 68 61 72 20 2a 7a nt nOut, char *z
34a0: 42 75 66 4f 75 74 29 7b 0a 20 20 4f 53 5f 54 49 BufOut){. OS_TI
34b0: 4d 45 5f 56 46 53 28 20 4f 53 5f 47 45 54 54 45 ME_VFS( OS_GETTE
34c0: 4d 50 4e 41 4d 45 2c 20 30 2c 20 30 2c 20 30 2c MPNAME, 0, 0, 0,
34d0: 20 30 2c 0a 20 20 20 20 52 45 41 4c 56 46 53 28 0,. REALVFS(
34e0: 70 56 66 73 29 2d 3e 78 47 65 74 54 65 6d 70 6e pVfs)->xGetTempn
34f0: 61 6d 65 28 52 45 41 4c 56 46 53 28 70 56 66 73 ame(REALVFS(pVfs
3500: 29 2c 20 6e 4f 75 74 2c 20 7a 42 75 66 4f 75 74 ), nOut, zBufOut
3510: 29 3b 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a );. );.}../*.**
3520: 20 50 6f 70 75 6c 61 74 65 20 62 75 66 66 65 72 Populate buffer
3530: 20 7a 4f 75 74 20 77 69 74 68 20 74 68 65 20 66 zOut with the f
3540: 75 6c 6c 20 63 61 6e 6f 6e 69 63 61 6c 20 70 61 ull canonical pa
3550: 74 68 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e thname correspon
3560: 64 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 70 ding.** to the p
3570: 61 74 68 6e 61 6d 65 20 69 6e 20 7a 50 61 74 68 athname in zPath
3580: 2e 20 7a 4f 75 74 20 69 73 20 67 75 61 72 61 6e . zOut is guaran
3590: 74 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f teed to point to
35a0: 20 61 20 62 75 66 66 65 72 0a 2a 2a 20 6f 66 20 a buffer.** of
35b0: 61 74 20 6c 65 61 73 74 20 28 49 4e 53 54 5f 4d at least (INST_M
35c0: 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 29 20 62 AX_PATHNAME+1) b
35d0: 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 ytes..*/.static
35e0: 69 6e 74 20 69 6e 73 74 46 75 6c 6c 50 61 74 68 int instFullPath
35f0: 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f name(. sqlite3_
3600: 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f vfs *pVfs, . co
3610: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c nst char *zPath,
3620: 20 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 0a 20 . int nOut, .
3630: 20 63 68 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a 20 char *zOut.){.
3640: 20 4f 53 5f 54 49 4d 45 5f 56 46 53 28 20 4f 53 OS_TIME_VFS( OS
3650: 5f 46 55 4c 4c 50 41 54 48 4e 41 4d 45 2c 20 7a _FULLPATHNAME, z
3660: 50 61 74 68 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 Path, 0, 0, 0,.
3670: 20 20 20 52 45 41 4c 56 46 53 28 70 56 66 73 29 REALVFS(pVfs)
3680: 2d 3e 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 ->xFullPathname(
3690: 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20 7a REALVFS(pVfs), z
36a0: 50 61 74 68 2c 20 6e 4f 75 74 2c 20 7a 4f 75 74 Path, nOut, zOut
36b0: 29 3b 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a );. );.}../*.**
36c0: 20 4f 70 65 6e 20 74 68 65 20 64 79 6e 61 6d 69 Open the dynami
36d0: 63 20 6c 69 62 72 61 72 79 20 6c 6f 63 61 74 65 c library locate
36e0: 64 20 61 74 20 7a 50 61 74 68 20 61 6e 64 20 72 d at zPath and r
36f0: 65 74 75 72 6e 20 61 20 68 61 6e 64 6c 65 2e 0a eturn a handle..
3700: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a */.static void *
3710: 69 6e 73 74 44 6c 4f 70 65 6e 28 73 71 6c 69 74 instDlOpen(sqlit
3720: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f e3_vfs *pVfs, co
3730: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 29 nst char *zPath)
3740: 7b 0a 20 20 72 65 74 75 72 6e 20 52 45 41 4c 56 {. return REALV
3750: 46 53 28 70 56 66 73 29 2d 3e 78 44 6c 4f 70 65 FS(pVfs)->xDlOpe
3760: 6e 28 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c n(REALVFS(pVfs),
3770: 20 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a zPath);.}../*.*
3780: 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62 * Populate the b
3790: 75 66 66 65 72 20 7a 45 72 72 4d 73 67 20 28 73 uffer zErrMsg (s
37a0: 69 7a 65 20 6e 42 79 74 65 20 62 79 74 65 73 29 ize nByte bytes)
37b0: 20 77 69 74 68 20 61 20 68 75 6d 61 6e 20 72 65 with a human re
37c0: 61 64 61 62 6c 65 0a 2a 2a 20 75 74 66 2d 38 20 adable.** utf-8
37d0: 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e string describin
37e0: 67 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e g the most recen
37f0: 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 t error encounte
3800: 72 65 64 20 61 73 73 6f 63 69 61 74 65 64 20 0a red associated .
3810: 2a 2a 20 77 69 74 68 20 64 79 6e 61 6d 69 63 20 ** with dynamic
3820: 6c 69 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 73 74 libraries..*/.st
3830: 61 74 69 63 20 76 6f 69 64 20 69 6e 73 74 44 6c atic void instDl
3840: 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 Error(sqlite3_vf
3850: 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79 s *pVfs, int nBy
3860: 74 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 te, char *zErrMs
3870: 67 29 7b 0a 20 20 52 45 41 4c 56 46 53 28 70 56 g){. REALVFS(pV
3880: 66 73 29 2d 3e 78 44 6c 45 72 72 6f 72 28 52 45 fs)->xDlError(RE
3890: 41 4c 56 46 53 28 70 56 66 73 29 2c 20 6e 42 79 ALVFS(pVfs), nBy
38a0: 74 65 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 7d 0a te, zErrMsg);.}.
38b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 ./*.** Return a
38c0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 pointer to the s
38d0: 79 6d 62 6f 6c 20 7a 53 79 6d 62 6f 6c 20 69 6e ymbol zSymbol in
38e0: 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 the dynamic lib
38f0: 72 61 72 79 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f rary pHandle..*/
3900: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 69 6e .static void *in
3910: 73 74 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f stDlSym(sqlite3_
3920: 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 vfs *pVfs, void
3930: 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 *pHandle, const
3940: 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 7b 0a char *zSymbol){.
3950: 20 20 72 65 74 75 72 6e 20 52 45 41 4c 56 46 53 return REALVFS
3960: 28 70 56 66 73 29 2d 3e 78 44 6c 53 79 6d 28 52 (pVfs)->xDlSym(R
3970: 45 41 4c 56 46 53 28 70 56 66 73 29 2c 20 70 48 EALVFS(pVfs), pH
3980: 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b andle, zSymbol);
3990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 .}../*.** Close
39a0: 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 the dynamic libr
39b0: 61 72 79 20 68 61 6e 64 6c 65 20 70 48 61 6e 64 ary handle pHand
39c0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f le..*/.static vo
39d0: 69 64 20 69 6e 73 74 44 6c 43 6c 6f 73 65 28 73 id instDlClose(s
39e0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 qlite3_vfs *pVfs
39f0: 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 , void *pHandle)
3a00: 7b 0a 20 20 52 45 41 4c 56 46 53 28 70 56 66 73 {. REALVFS(pVfs
3a10: 29 2d 3e 78 44 6c 43 6c 6f 73 65 28 52 45 41 4c )->xDlClose(REAL
3a20: 56 46 53 28 70 56 66 73 29 2c 20 70 48 61 6e 64 VFS(pVfs), pHand
3a30: 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f le);.}../*.** Po
3a40: 70 75 6c 61 74 65 20 74 68 65 20 62 75 66 66 65 pulate the buffe
3a50: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 r pointed to by
3a60: 7a 42 75 66 4f 75 74 20 77 69 74 68 20 6e 42 79 zBufOut with nBy
3a70: 74 65 20 62 79 74 65 73 20 6f 66 20 0a 2a 2a 20 te bytes of .**
3a80: 72 61 6e 64 6f 6d 20 64 61 74 61 2e 0a 2a 2f 0a random data..*/.
3a90: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 52 static int instR
3aa0: 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 andomness(sqlite
3ab0: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 3_vfs *pVfs, int
3ac0: 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 42 nByte, char *zB
3ad0: 75 66 4f 75 74 29 7b 0a 20 20 4f 53 5f 54 49 4d ufOut){. OS_TIM
3ae0: 45 5f 56 46 53 28 20 4f 53 5f 52 41 4e 44 4f 4d E_VFS( OS_RANDOM
3af0: 4e 45 53 53 2c 20 30 2c 20 30 2c 20 6e 42 79 74 NESS, 0, 0, nByt
3b00: 65 2c 20 30 2c 0a 20 20 20 20 52 45 41 4c 56 46 e, 0,. REALVF
3b10: 53 28 70 56 66 73 29 2d 3e 78 52 61 6e 64 6f 6d S(pVfs)->xRandom
3b20: 6e 65 73 73 28 52 45 41 4c 56 46 53 28 70 56 66 ness(REALVFS(pVf
3b30: 73 29 2c 20 6e 42 79 74 65 2c 20 7a 42 75 66 4f s), nByte, zBufO
3b40: 75 74 29 3b 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a ut);. );.}../*.
3b50: 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 6e 4d 69 ** Sleep for nMi
3b60: 63 72 6f 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 cro microseconds
3b70: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d . Return the num
3b80: 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f ber of microseco
3b90: 6e 64 73 20 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 nds .** actually
3ba0: 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 slept..*/.stati
3bb0: 63 20 69 6e 74 20 69 6e 73 74 53 6c 65 65 70 28 c int instSleep(
3bc0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 sqlite3_vfs *pVf
3bd0: 73 2c 20 69 6e 74 20 6e 4d 69 63 72 6f 29 7b 0a s, int nMicro){.
3be0: 20 20 4f 53 5f 54 49 4d 45 5f 56 46 53 28 20 4f OS_TIME_VFS( O
3bf0: 53 5f 53 4c 45 45 50 2c 20 30 2c 20 30 2c 20 6e S_SLEEP, 0, 0, n
3c00: 4d 69 63 72 6f 2c 20 30 2c 20 0a 20 20 20 20 52 Micro, 0, . R
3c10: 45 41 4c 56 46 53 28 70 56 66 73 29 2d 3e 78 53 EALVFS(pVfs)->xS
3c20: 6c 65 65 70 28 52 45 41 4c 56 46 53 28 70 56 66 leep(REALVFS(pVf
3c30: 73 29 2c 20 6e 4d 69 63 72 6f 29 20 0a 20 20 29 s), nMicro) . )
3c40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 ;.}../*.** Retur
3c50: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 n the current ti
3c60: 6d 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 me as a Julian D
3c70: 61 79 20 6e 75 6d 62 65 72 20 69 6e 20 2a 70 54 ay number in *pT
3c80: 69 6d 65 4f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 imeOut..*/.stati
3c90: 63 20 69 6e 74 20 69 6e 73 74 43 75 72 72 65 6e c int instCurren
3ca0: 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 tTime(sqlite3_vf
3cb0: 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 s *pVfs, double
3cc0: 2a 70 54 69 6d 65 4f 75 74 29 7b 0a 20 20 4f 53 *pTimeOut){. OS
3cd0: 5f 54 49 4d 45 5f 56 46 53 28 20 4f 53 5f 43 55 _TIME_VFS( OS_CU
3ce0: 52 52 45 4e 54 54 49 4d 45 2c 20 30 2c 20 30 2c RRENTTIME, 0, 0,
3cf0: 20 30 2c 20 30 2c 0a 20 20 20 20 52 45 41 4c 56 0, 0,. REALV
3d00: 46 53 28 70 56 66 73 29 2d 3e 78 43 75 72 72 65 FS(pVfs)->xCurre
3d10: 6e 74 54 69 6d 65 28 52 45 41 4c 56 46 53 28 70 ntTime(REALVFS(p
3d20: 56 66 73 29 2c 20 70 54 69 6d 65 4f 75 74 29 20 Vfs), pTimeOut)
3d30: 0a 20 20 29 3b 0a 7d 0a 0a 73 71 6c 69 74 65 33 . );.}..sqlite3
3d40: 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 5f 69 6e _vfs *sqlite3_in
3d50: 73 74 76 66 73 5f 63 72 65 61 74 65 28 63 6f 6e stvfs_create(con
3d60: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 st char *zName,
3d70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 const char *zPar
3d80: 65 6e 74 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 ent){. int nByt
3d90: 65 3b 0a 20 20 49 6e 73 74 56 66 73 20 2a 70 3b e;. InstVfs *p;
3da0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a . sqlite3_vfs *
3db0: 70 50 61 72 65 6e 74 3b 0a 0a 20 20 70 50 61 72 pParent;.. pPar
3dc0: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 ent = sqlite3_vf
3dd0: 73 5f 66 69 6e 64 28 7a 50 61 72 65 6e 74 29 3b s_find(zParent);
3de0: 0a 20 20 69 66 28 20 21 70 50 61 72 65 6e 74 20 . if( !pParent
3df0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b ){. return 0;
3e00: 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 20 3d 20 . }.. nByte =
3e10: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 strlen(zName) +
3e20: 31 20 2b 20 73 69 7a 65 6f 66 28 49 6e 73 74 56 1 + sizeof(InstV
3e30: 66 73 29 3b 0a 20 20 70 20 3d 20 28 49 6e 73 74 fs);. p = (Inst
3e40: 56 66 73 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 Vfs *)sqlite3_ma
3e50: 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 69 lloc(nByte);. i
3e60: 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72 f( p ){. char
3e70: 20 2a 7a 43 6f 70 79 20 3d 20 28 63 68 61 72 20 *zCopy = (char
3e80: 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d *)&p[1];. mem
3e90: 73 65 74 28 70 2c 20 30 2c 20 6e 42 79 74 65 29 set(p, 0, nByte)
3ea0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 ;. memcpy(p,
3eb0: 26 69 6e 73 74 5f 76 66 73 2c 20 73 69 7a 65 6f &inst_vfs, sizeo
3ec0: 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29 29 3b f(sqlite3_vfs));
3ed0: 0a 20 20 20 20 70 2d 3e 70 56 66 73 20 3d 20 70 . p->pVfs = p
3ee0: 50 61 72 65 6e 74 3b 0a 20 20 20 20 6d 65 6d 63 Parent;. memc
3ef0: 70 79 28 7a 43 6f 70 79 2c 20 7a 4e 61 6d 65 2c py(zCopy, zName,
3f00: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b strlen(zName));
3f10: 0a 20 20 20 20 70 2d 3e 62 61 73 65 2e 7a 4e 61 . p->base.zNa
3f20: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 me = (const char
3f30: 20 2a 29 7a 43 6f 70 79 3b 0a 20 20 20 20 70 2d *)zCopy;. p-
3f40: 3e 62 61 73 65 2e 73 7a 4f 73 46 69 6c 65 20 2b >base.szOsFile +
3f50: 3d 20 70 50 61 72 65 6e 74 2d 3e 73 7a 4f 73 46 = pParent->szOsF
3f60: 69 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 ile;. sqlite3
3f70: 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 28 73 _vfs_register((s
3f80: 71 6c 69 74 65 33 5f 76 66 73 20 2a 29 70 2c 20 qlite3_vfs *)p,
3f90: 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 0);. }.. retur
3fa0: 6e 20 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a n (sqlite3_vfs *
3fb0: 29 70 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 )p;.}..void sqli
3fc0: 74 65 33 5f 69 6e 73 74 76 66 73 5f 63 6f 6e 66 te3_instvfs_conf
3fd0: 69 67 75 72 65 28 0a 20 20 73 71 6c 69 74 65 33 igure(. sqlite3
3fe0: 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 76 6f _vfs *pVfs,. vo
3ff0: 69 64 20 28 2a 78 43 61 6c 6c 29 28 0a 20 20 20 id (*xCall)(.
4000: 20 20 20 76 6f 69 64 2a 2c 20 0a 20 20 20 20 20 void*, .
4010: 20 69 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 int,
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4030: 2f 2a 20 46 69 6c 65 20 69 64 20 2a 2f 0a 20 20 /* File id */.
4040: 20 20 20 20 69 6e 74 2c 20 20 20 20 20 20 20 20 int,
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4060: 20 20 20 2f 2a 20 45 76 65 6e 74 20 63 6f 64 65 /* Event code
4070: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 */. sqlite
4080: 33 5f 69 6e 74 36 34 2c 20 0a 20 20 20 20 20 20 3_int64, .
4090: 69 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 int,
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
40b0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f * Return code */
40c0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 . const cha
40d0: 72 2a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 r*,
40e0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 /* File na
40f0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 2c me */. int,
4100: 20 0a 20 20 20 20 20 20 69 6e 74 2c 20 0a 20 20 . int, .
4110: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 sqlite3_int6
4120: 34 0a 20 20 29 2c 0a 20 20 76 6f 69 64 20 2a 70 4. ),. void *p
4130: 43 6c 69 65 6e 74 2c 0a 20 20 76 6f 69 64 20 28 Client,. void (
4140: 2a 78 44 65 6c 29 28 76 6f 69 64 20 2a 29 0a 29 *xDel)(void *).)
4150: 7b 0a 20 20 49 6e 73 74 56 66 73 20 2a 70 20 3d {. InstVfs *p =
4160: 20 28 49 6e 73 74 56 66 73 20 2a 29 70 56 66 73 (InstVfs *)pVfs
4170: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 ;. assert( pVfs
4180: 2d 3e 78 4f 70 65 6e 3d 3d 69 6e 73 74 4f 70 65 ->xOpen==instOpe
4190: 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 78 44 n );. if( p->xD
41a0: 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 78 44 65 el ){. p->xDe
41b0: 6c 28 70 2d 3e 70 43 6c 69 65 6e 74 29 3b 0a 20 l(p->pClient);.
41c0: 20 7d 0a 20 20 70 2d 3e 78 43 61 6c 6c 20 3d 20 }. p->xCall =
41d0: 78 43 61 6c 6c 3b 0a 20 20 70 2d 3e 78 44 65 6c xCall;. p->xDel
41e0: 20 3d 20 78 44 65 6c 3b 0a 20 20 70 2d 3e 70 43 = xDel;. p->pC
41f0: 6c 69 65 6e 74 20 3d 20 70 43 6c 69 65 6e 74 3b lient = pClient;
4200: 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .}..void sqlite3
4210: 5f 69 6e 73 74 76 66 73 5f 64 65 73 74 72 6f 79 _instvfs_destroy
4220: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 (sqlite3_vfs *pV
4230: 66 73 29 7b 0a 20 20 69 66 28 20 70 56 66 73 20 fs){. if( pVfs
4240: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 ){. sqlite3_v
4250: 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 70 56 fs_unregister(pV
4260: 66 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 fs);. sqlite3
4270: 5f 69 6e 73 74 76 66 73 5f 63 6f 6e 66 69 67 75 _instvfs_configu
4280: 72 65 28 70 56 66 73 2c 20 30 2c 20 30 2c 20 30 re(pVfs, 0, 0, 0
4290: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 );. sqlite3_f
42a0: 72 65 65 28 70 56 66 73 29 3b 0a 20 20 7d 0a 7d ree(pVfs);. }.}
42b0: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 ..void sqlite3_i
42c0: 6e 73 74 76 66 73 5f 72 65 73 65 74 28 73 71 6c nstvfs_reset(sql
42d0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 29 7b ite3_vfs *pVfs){
42e0: 0a 20 20 49 6e 73 74 56 66 73 20 2a 70 20 3d 20 . InstVfs *p =
42f0: 28 49 6e 73 74 56 66 73 20 2a 29 70 56 66 73 3b (InstVfs *)pVfs;
4300: 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d . assert( pVfs-
4310: 3e 78 4f 70 65 6e 3d 3d 69 6e 73 74 4f 70 65 6e >xOpen==instOpen
4320: 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2d 3e );. memset(p->
4330: 61 54 69 6d 65 2c 20 30 2c 20 73 69 7a 65 6f 66 aTime, 0, sizeof
4340: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 2a (sqlite3_int64)*
4350: 4f 53 5f 4e 55 4d 45 56 45 4e 54 53 29 3b 0a 20 OS_NUMEVENTS);.
4360: 20 6d 65 6d 73 65 74 28 70 2d 3e 61 43 6f 75 6e memset(p->aCoun
4370: 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 74 t, 0, sizeof(int
4380: 29 2a 4f 53 5f 4e 55 4d 45 56 45 4e 54 53 29 3b )*OS_NUMEVENTS);
4390: 0a 7d 0a 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a .}..const char *
43a0: 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f sqlite3_instvfs_
43b0: 6e 61 6d 65 28 69 6e 74 20 65 45 76 65 6e 74 29 name(int eEvent)
43c0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a {. const char *
43d0: 7a 45 76 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 73 zEvent = 0;.. s
43e0: 77 69 74 63 68 28 20 65 45 76 65 6e 74 20 29 7b witch( eEvent ){
43f0: 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 43 4c 4f . case OS_CLO
4400: 53 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 SE:
4410: 7a 45 76 65 6e 74 20 3d 20 22 78 43 6c 6f 73 65 zEvent = "xClose
4420: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 "; break;. ca
4430: 73 65 20 4f 53 5f 52 45 41 44 3a 20 20 20 20 20 se OS_READ:
4440: 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 zEvent
4450: 3d 20 22 78 52 65 61 64 22 3b 20 62 72 65 61 6b = "xRead"; break
4460: 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 57 52 ;. case OS_WR
4470: 49 54 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 ITE:
4480: 20 7a 45 76 65 6e 74 20 3d 20 22 78 57 72 69 74 zEvent = "xWrit
4490: 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 e"; break;. c
44a0: 61 73 65 20 4f 53 5f 54 52 55 4e 43 41 54 45 3a ase OS_TRUNCATE:
44b0: 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 zEvent
44c0: 20 3d 20 22 78 54 72 75 6e 63 61 74 65 22 3b 20 = "xTruncate";
44d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
44e0: 4f 53 5f 53 59 4e 43 3a 20 20 20 20 20 20 20 20 OS_SYNC:
44f0: 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 zEvent = "
4500: 78 53 79 6e 63 22 3b 20 62 72 65 61 6b 3b 0a 20 xSync"; break;.
4510: 20 20 20 63 61 73 65 20 4f 53 5f 46 49 4c 45 53 case OS_FILES
4520: 49 5a 45 3a 20 20 20 20 20 20 20 20 20 20 7a 45 IZE: zE
4530: 76 65 6e 74 20 3d 20 22 78 46 69 6c 65 73 69 7a vent = "xFilesiz
4540: 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 e"; break;. c
4550: 61 73 65 20 4f 53 5f 4c 4f 43 4b 3a 20 20 20 20 ase OS_LOCK:
4560: 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 zEvent
4570: 20 3d 20 22 78 4c 6f 63 6b 22 3b 20 62 72 65 61 = "xLock"; brea
4580: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 55 k;. case OS_U
4590: 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 20 20 NLOCK:
45a0: 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 55 6e 6c zEvent = "xUnl
45b0: 6f 63 6b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 ock"; break;.
45c0: 20 63 61 73 65 20 4f 53 5f 43 48 45 43 4b 52 45 case OS_CHECKRE
45d0: 53 45 52 56 45 44 4c 4f 43 4b 3a 20 7a 45 76 65 SERVEDLOCK: zEve
45e0: 6e 74 20 3d 20 22 78 43 68 65 63 6b 52 65 73 65 nt = "xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 22 3b 20 62 72 65 61 6b rvedLock"; break
4600: 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 46 49 ;. case OS_FI
4610: 4c 45 43 4f 4e 54 52 4f 4c 3a 20 20 20 20 20 20 LECONTROL:
4620: 20 7a 45 76 65 6e 74 20 3d 20 22 78 46 69 6c 65 zEvent = "xFile
4630: 43 6f 6e 74 72 6f 6c 22 3b 20 62 72 65 61 6b 3b Control"; break;
4640: 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 53 45 43 . case OS_SEC
4650: 54 4f 52 53 49 5a 45 3a 20 20 20 20 20 20 20 20 TORSIZE:
4660: 7a 45 76 65 6e 74 20 3d 20 22 78 53 65 63 74 6f zEvent = "xSecto
4670: 72 53 69 7a 65 22 3b 20 62 72 65 61 6b 3b 0a 20 rSize"; break;.
4680: 20 20 20 63 61 73 65 20 4f 53 5f 44 45 56 43 48 case OS_DEVCH
4690: 41 52 3a 20 20 20 20 20 20 20 20 20 20 20 7a 45 AR: zE
46a0: 76 65 6e 74 20 3d 20 22 78 44 65 76 69 63 65 43 vent = "xDeviceC
46b0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 22 3b haracteristics";
46c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 break;. case
46d0: 20 4f 53 5f 4f 50 45 4e 3a 20 20 20 20 20 20 20 OS_OPEN:
46e0: 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 zEvent =
46f0: 22 78 4f 70 65 6e 22 3b 20 62 72 65 61 6b 3b 0a "xOpen"; break;.
4700: 20 20 20 20 63 61 73 65 20 4f 53 5f 44 45 4c 45 case OS_DELE
4710: 54 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a TE: z
4720: 45 76 65 6e 74 20 3d 20 22 78 44 65 6c 65 74 65 Event = "xDelete
4730: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 "; break;. ca
4740: 73 65 20 4f 53 5f 41 43 43 45 53 53 3a 20 20 20 se OS_ACCESS:
4750: 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 zEvent
4760: 3d 20 22 78 41 63 63 65 73 73 22 3b 20 62 72 65 = "xAccess"; bre
4770: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f ak;. case OS_
4780: 47 45 54 54 45 4d 50 4e 41 4d 45 3a 20 20 20 20 GETTEMPNAME:
4790: 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 47 65 zEvent = "xGe
47a0: 74 54 65 6d 70 4e 61 6d 65 22 3b 20 62 72 65 61 tTempName"; brea
47b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 46 k;. case OS_F
47c0: 55 4c 4c 50 41 54 48 4e 41 4d 45 3a 20 20 20 20 ULLPATHNAME:
47d0: 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 46 75 6c zEvent = "xFul
47e0: 6c 50 61 74 68 6e 61 6d 65 22 3b 20 62 72 65 61 lPathname"; brea
47f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 52 k;. case OS_R
4800: 41 4e 44 4f 4d 4e 45 53 53 3a 20 20 20 20 20 20 ANDOMNESS:
4810: 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 52 61 6e zEvent = "xRan
4820: 64 6f 6d 6e 65 73 73 22 3b 20 62 72 65 61 6b 3b domness"; break;
4830: 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 53 4c 45 . case OS_SLE
4840: 45 50 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 EP:
4850: 7a 45 76 65 6e 74 20 3d 20 22 78 53 6c 65 65 70 zEvent = "xSleep
4860: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 "; break;. ca
4870: 73 65 20 4f 53 5f 43 55 52 52 45 4e 54 54 49 4d se OS_CURRENTTIM
4880: 45 3a 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 E: zEvent
4890: 3d 20 22 78 43 75 72 72 65 6e 74 54 69 6d 65 22 = "xCurrentTime"
48a0: 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 ; break;. }..
48b0: 72 65 74 75 72 6e 20 7a 45 76 65 6e 74 3b 0a 7d return zEvent;.}
48c0: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 ..void sqlite3_i
48d0: 6e 73 74 76 66 73 5f 67 65 74 28 0a 20 20 73 71 nstvfs_get(. sq
48e0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c lite3_vfs *pVfs,
48f0: 20 0a 20 20 69 6e 74 20 65 45 76 65 6e 74 2c 20 . int eEvent,
4900: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a . const char **
4910: 70 7a 45 76 65 6e 74 2c 20 0a 20 20 73 71 6c 69 pzEvent, . sqli
4920: 74 65 33 5f 69 6e 74 36 34 20 2a 70 6e 43 6c 69 te3_int64 *pnCli
4930: 63 6b 2c 20 0a 20 20 69 6e 74 20 2a 70 6e 43 61 ck, . int *pnCa
4940: 6c 6c 0a 29 7b 0a 20 20 49 6e 73 74 56 66 73 20 ll.){. InstVfs
4950: 2a 70 20 3d 20 28 49 6e 73 74 56 66 73 20 2a 29 *p = (InstVfs *)
4960: 70 56 66 73 3b 0a 20 20 61 73 73 65 72 74 28 20 pVfs;. assert(
4970: 70 56 66 73 2d 3e 78 4f 70 65 6e 3d 3d 69 6e 73 pVfs->xOpen==ins
4980: 74 4f 70 65 6e 20 29 3b 0a 20 20 69 66 28 20 65 tOpen );. if( e
4990: 45 76 65 6e 74 3c 31 20 7c 7c 20 65 45 76 65 6e Event<1 || eEven
49a0: 74 3e 3d 4f 53 5f 4e 55 4d 45 56 45 4e 54 53 20 t>=OS_NUMEVENTS
49b0: 29 7b 0a 20 20 20 20 2a 70 7a 45 76 65 6e 74 20 ){. *pzEvent
49c0: 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6c 69 63 = 0;. *pnClic
49d0: 6b 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 61 k = 0;. *pnCa
49e0: 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 ll = 0;. retu
49f0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2a 70 7a 45 76 rn;. }.. *pzEv
4a00: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e ent = sqlite3_in
4a10: 73 74 76 66 73 5f 6e 61 6d 65 28 65 45 76 65 6e stvfs_name(eEven
4a20: 74 29 3b 0a 20 20 2a 70 6e 43 6c 69 63 6b 20 3d t);. *pnClick =
4a30: 20 70 2d 3e 61 54 69 6d 65 5b 65 45 76 65 6e 74 p->aTime[eEvent
4a40: 5d 3b 0a 20 20 2a 70 6e 43 61 6c 6c 20 3d 20 70 ];. *pnCall = p
4a50: 2d 3e 61 43 6f 75 6e 74 5b 65 45 76 65 6e 74 5d ->aCount[eEvent]
4a60: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42 49 4e ;.}..#define BIN
4a70: 41 52 59 4c 4f 47 5f 42 55 46 46 45 52 53 49 5a ARYLOG_BUFFERSIZ
4a80: 45 20 31 30 32 34 0a 0a 73 74 72 75 63 74 20 49 E 1024..struct I
4a90: 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 nstVfsBinaryLog
4aa0: 7b 0a 20 20 69 6e 74 20 6e 42 75 66 3b 0a 20 20 {. int nBuf;.
4ab0: 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 73 71 char *zBuf;. sq
4ac0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 lite3_int64 iOff
4ad0: 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 set;. sqlite3_f
4ae0: 69 6c 65 20 2a 70 4f 75 74 3b 0a 20 20 63 68 61 ile *pOut;. cha
4af0: 72 20 2a 7a 4f 75 74 3b 20 20 20 20 20 20 20 20 r *zOut;
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
4b10: 2a 20 4c 6f 67 20 66 69 6c 65 20 6e 61 6d 65 20 * Log file name
4b20: 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 */.};.typedef st
4b30: 72 75 63 74 20 49 6e 73 74 56 66 73 42 69 6e 61 ruct InstVfsBina
4b40: 72 79 4c 6f 67 20 49 6e 73 74 56 66 73 42 69 6e ryLog InstVfsBin
4b50: 61 72 79 4c 6f 67 3b 0a 0a 73 74 61 74 69 63 20 aryLog;..static
4b60: 76 6f 69 64 20 70 75 74 33 32 62 69 74 73 28 75 void put32bits(u
4b70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c nsigned char *p,
4b80: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 29 unsigned int v)
4b90: 7b 0a 20 20 70 5b 30 5d 20 3d 20 76 3e 3e 32 34 {. p[0] = v>>24
4ba0: 3b 0a 20 20 70 5b 31 5d 20 3d 20 76 3e 3e 31 36 ;. p[1] = v>>16
4bb0: 3b 0a 20 20 70 5b 32 5d 20 3d 20 76 3e 3e 38 3b ;. p[2] = v>>8;
4bc0: 0a 20 20 70 5b 33 5d 20 3d 20 76 3b 0a 7d 0a 0a . p[3] = v;.}..
4bd0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 69 6e 61 static void bina
4be0: 72 79 6c 6f 67 5f 78 63 61 6c 6c 28 0a 20 20 76 rylog_xcall(. v
4bf0: 6f 69 64 20 2a 70 2c 0a 20 20 69 6e 74 20 65 45 oid *p,. int eE
4c00: 76 65 6e 74 2c 0a 20 20 69 6e 74 20 69 46 69 6c vent,. int iFil
4c10: 65 49 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 eId,. sqlite3_i
4c20: 6e 74 36 34 20 6e 43 6c 69 63 6b 2c 0a 20 20 69 nt64 nClick,. i
4c30: 6e 74 20 72 65 74 75 72 6e 5f 63 6f 64 65 2c 0a nt return_code,.
4c40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e const char *zN
4c50: 61 6d 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 ame,. int flags
4c60: 2c 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 0a 20 ,. int nByte,.
4c70: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 sqlite3_int64 i
4c80: 4f 66 66 73 65 74 0a 29 7b 0a 20 20 49 6e 73 74 Offset.){. Inst
4c90: 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 2a 70 4c VfsBinaryLog *pL
4ca0: 6f 67 20 3d 20 28 49 6e 73 74 56 66 73 42 69 6e og = (InstVfsBin
4cb0: 61 72 79 4c 6f 67 20 2a 29 70 3b 0a 20 20 75 6e aryLog *)p;. un
4cc0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 52 65 signed char *zRe
4cd0: 63 3b 0a 20 20 69 66 28 20 28 32 38 2b 70 4c 6f c;. if( (28+pLo
4ce0: 67 2d 3e 6e 42 75 66 29 3e 42 49 4e 41 52 59 4c g->nBuf)>BINARYL
4cf0: 4f 47 5f 42 55 46 46 45 52 53 49 5a 45 20 29 7b OG_BUFFERSIZE ){
4d00: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c . sqlite3_fil
4d10: 65 20 2a 70 46 69 6c 65 20 3d 20 70 4c 6f 67 2d e *pFile = pLog-
4d20: 3e 70 4f 75 74 3b 0a 20 20 20 20 70 46 69 6c 65 >pOut;. pFile
4d30: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 57 72 69 ->pMethods->xWri
4d40: 74 65 28 70 46 69 6c 65 2c 20 70 4c 6f 67 2d 3e te(pFile, pLog->
4d50: 7a 42 75 66 2c 20 70 4c 6f 67 2d 3e 6e 42 75 66 zBuf, pLog->nBuf
4d60: 2c 20 70 4c 6f 67 2d 3e 69 4f 66 66 73 65 74 29 , pLog->iOffset)
4d70: 3b 0a 20 20 20 20 70 4c 6f 67 2d 3e 69 4f 66 66 ;. pLog->iOff
4d80: 73 65 74 20 2b 3d 20 70 4c 6f 67 2d 3e 6e 42 75 set += pLog->nBu
4d90: 66 3b 0a 20 20 20 20 70 4c 6f 67 2d 3e 6e 42 75 f;. pLog->nBu
4da0: 66 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 52 65 f = 0;. }. zRe
4db0: 63 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 c = (unsigned ch
4dc0: 61 72 20 2a 29 26 70 4c 6f 67 2d 3e 7a 42 75 66 ar *)&pLog->zBuf
4dd0: 5b 70 4c 6f 67 2d 3e 6e 42 75 66 5d 3b 0a 20 20 [pLog->nBuf];.
4de0: 70 75 74 33 32 62 69 74 73 28 26 7a 52 65 63 5b put32bits(&zRec[
4df0: 30 5d 2c 20 65 45 76 65 6e 74 29 3b 0a 20 20 70 0], eEvent);. p
4e00: 75 74 33 32 62 69 74 73 28 26 7a 52 65 63 5b 34 ut32bits(&zRec[4
4e10: 5d 2c 20 28 69 6e 74 29 69 46 69 6c 65 49 64 29 ], (int)iFileId)
4e20: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a ;. put32bits(&z
4e30: 52 65 63 5b 38 5d 2c 20 28 69 6e 74 29 6e 43 6c Rec[8], (int)nCl
4e40: 69 63 6b 29 3b 0a 20 20 70 75 74 33 32 62 69 74 ick);. put32bit
4e50: 73 28 26 7a 52 65 63 5b 31 32 5d 2c 20 72 65 74 s(&zRec[12], ret
4e60: 75 72 6e 5f 63 6f 64 65 29 3b 0a 20 20 70 75 74 urn_code);. put
4e70: 33 32 62 69 74 73 28 26 7a 52 65 63 5b 31 36 5d 32bits(&zRec[16]
4e80: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 75 74 33 , flags);. put3
4e90: 32 62 69 74 73 28 26 7a 52 65 63 5b 32 30 5d 2c 2bits(&zRec[20],
4ea0: 20 6e 42 79 74 65 29 3b 0a 20 20 70 75 74 33 32 nByte);. put32
4eb0: 62 69 74 73 28 26 7a 52 65 63 5b 32 34 5d 2c 20 bits(&zRec[24],
4ec0: 28 69 6e 74 29 69 4f 66 66 73 65 74 29 3b 0a 20 (int)iOffset);.
4ed0: 20 70 4c 6f 67 2d 3e 6e 42 75 66 20 2b 3d 20 32 pLog->nBuf += 2
4ee0: 38 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 8;.}..static voi
4ef0: 64 20 62 69 6e 61 72 79 6c 6f 67 5f 78 64 65 6c d binarylog_xdel
4f00: 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 (void *p){. /*
4f10: 43 6c 6f 73 65 20 74 68 65 20 6c 6f 67 20 66 69 Close the log fi
4f20: 6c 65 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 le and free the
4f30: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 memory allocated
4f40: 20 66 6f 72 20 74 68 65 20 0a 20 20 2a 2a 20 49 for the . ** I
4f50: 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 nstVfsBinaryLog
4f60: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a structure.. */.
4f70: 20 20 49 6e 73 74 56 66 73 42 69 6e 61 72 79 4c InstVfsBinaryL
4f80: 6f 67 20 2a 70 4c 6f 67 20 3d 20 28 49 6e 73 74 og *pLog = (Inst
4f90: 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 2a 29 70 VfsBinaryLog *)p
4fa0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 ;. sqlite3_file
4fb0: 20 2a 70 46 69 6c 65 20 3d 20 70 4c 6f 67 2d 3e *pFile = pLog->
4fc0: 70 4f 75 74 3b 0a 20 20 69 66 28 20 70 4c 6f 67 pOut;. if( pLog
4fd0: 2d 3e 6e 42 75 66 20 29 7b 0a 20 20 20 20 70 46 ->nBuf ){. pF
4fe0: 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 ile->pMethods->x
4ff0: 57 72 69 74 65 28 70 46 69 6c 65 2c 20 70 4c 6f Write(pFile, pLo
5000: 67 2d 3e 7a 42 75 66 2c 20 70 4c 6f 67 2d 3e 6e g->zBuf, pLog->n
5010: 42 75 66 2c 20 70 4c 6f 67 2d 3e 69 4f 66 66 73 Buf, pLog->iOffs
5020: 65 74 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 et);. }. pFile
5030: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43 6c 6f ->pMethods->xClo
5040: 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c se(pFile);. sql
5050: 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 67 2d 3e ite3_free(pLog->
5060: 70 4f 75 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 pOut);. sqlite3
5070: 5f 66 72 65 65 28 70 4c 6f 67 2d 3e 7a 42 75 66 _free(pLog->zBuf
5080: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 );. sqlite3_fre
5090: 65 28 70 4c 6f 67 29 3b 0a 7d 0a 0a 73 74 61 74 e(pLog);.}..stat
50a0: 69 63 20 76 6f 69 64 20 62 69 6e 61 72 79 6c 6f ic void binarylo
50b0: 67 5f 62 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65 g_blob(. sqlite
50c0: 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 3_vfs *pVfs,. c
50d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 6c 6f 62 onst char *zBlob
50e0: 2c 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b ,. int nBlob.){
50f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 . unsigned char
5100: 20 2a 7a 52 65 63 3b 0a 20 20 69 6e 74 20 6e 57 *zRec;. int nW
5110: 72 69 74 65 3b 0a 20 20 49 6e 73 74 56 66 73 20 rite;. InstVfs
5120: 2a 70 49 6e 73 74 56 66 73 20 3d 20 28 49 6e 73 *pInstVfs = (Ins
5130: 74 56 66 73 20 2a 29 70 56 66 73 3b 0a 20 20 49 tVfs *)pVfs;. I
5140: 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 nstVfsBinaryLog
5150: 2a 70 4c 6f 67 3b 0a 0a 20 20 69 66 28 20 70 56 *pLog;.. if( pV
5160: 66 73 2d 3e 78 4f 70 65 6e 21 3d 69 6e 73 74 4f fs->xOpen!=instO
5170: 70 65 6e 20 7c 7c 20 70 49 6e 73 74 56 66 73 2d pen || pInstVfs-
5180: 3e 78 43 61 6c 6c 21 3d 62 69 6e 61 72 79 6c 6f >xCall!=binarylo
5190: 67 5f 78 63 61 6c 6c 20 29 7b 0a 20 20 20 20 72 g_xcall ){. r
51a0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70 4c eturn;. }.. pL
51b0: 6f 67 20 3d 20 28 49 6e 73 74 56 66 73 42 69 6e og = (InstVfsBin
51c0: 61 72 79 4c 6f 67 20 2a 29 70 49 6e 73 74 56 66 aryLog *)pInstVf
51d0: 73 2d 3e 70 43 6c 69 65 6e 74 3b 0a 20 20 69 66 s->pClient;. if
51e0: 28 20 6e 42 6c 6f 62 3c 30 20 29 7b 0a 20 20 20 ( nBlob<0 ){.
51f0: 20 6e 42 6c 6f 62 20 3d 20 73 74 72 6c 65 6e 28 nBlob = strlen(
5200: 7a 42 6c 6f 62 29 3b 0a 20 20 7d 0a 20 20 6e 57 zBlob);. }. nW
5210: 72 69 74 65 20 3d 20 6e 42 6c 6f 62 20 2b 20 32 rite = nBlob + 2
5220: 38 3b 0a 0a 20 20 69 66 28 20 28 6e 57 72 69 74 8;.. if( (nWrit
5230: 65 2b 70 4c 6f 67 2d 3e 6e 42 75 66 29 3e 42 49 e+pLog->nBuf)>BI
5240: 4e 41 52 59 4c 4f 47 5f 42 55 46 46 45 52 53 49 NARYLOG_BUFFERSI
5250: 5a 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 ZE ){. sqlite
5260: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 3_file *pFile =
5270: 70 4c 6f 67 2d 3e 70 4f 75 74 3b 0a 20 20 20 20 pLog->pOut;.
5280: 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d pFile->pMethods-
5290: 3e 78 57 72 69 74 65 28 70 46 69 6c 65 2c 20 70 >xWrite(pFile, p
52a0: 4c 6f 67 2d 3e 7a 42 75 66 2c 20 70 4c 6f 67 2d Log->zBuf, pLog-
52b0: 3e 6e 42 75 66 2c 20 70 4c 6f 67 2d 3e 69 4f 66 >nBuf, pLog->iOf
52c0: 66 73 65 74 29 3b 0a 20 20 20 20 70 4c 6f 67 2d fset);. pLog-
52d0: 3e 69 4f 66 66 73 65 74 20 2b 3d 20 70 4c 6f 67 >iOffset += pLog
52e0: 2d 3e 6e 42 75 66 3b 0a 20 20 20 20 70 4c 6f 67 ->nBuf;. pLog
52f0: 2d 3e 6e 42 75 66 20 3d 20 30 3b 0a 20 20 7d 0a ->nBuf = 0;. }.
5300: 0a 20 20 7a 52 65 63 20 3d 20 28 75 6e 73 69 67 . zRec = (unsig
5310: 6e 65 64 20 63 68 61 72 20 2a 29 26 70 4c 6f 67 ned char *)&pLog
5320: 2d 3e 7a 42 75 66 5b 70 4c 6f 67 2d 3e 6e 42 75 ->zBuf[pLog->nBu
5330: 66 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 52 65 f];. memset(zRe
5340: 63 2c 20 30 2c 20 6e 57 72 69 74 65 29 3b 0a 20 c, 0, nWrite);.
5350: 20 70 75 74 33 32 62 69 74 73 28 26 7a 52 65 63 put32bits(&zRec
5360: 5b 30 5d 2c 20 42 49 4e 41 52 59 4c 4f 47 5f 53 [0], BINARYLOG_S
5370: 54 52 49 4e 47 29 3b 0a 20 20 70 75 74 33 32 62 TRING);. put32b
5380: 69 74 73 28 26 7a 52 65 63 5b 34 5d 2c 20 28 69 its(&zRec[4], (i
5390: 6e 74 29 6e 42 6c 6f 62 29 3b 0a 20 20 6d 65 6d nt)nBlob);. mem
53a0: 63 70 79 28 26 7a 52 65 63 5b 32 38 5d 2c 20 7a cpy(&zRec[28], z
53b0: 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 Blob, nBlob);.
53c0: 70 4c 6f 67 2d 3e 6e 42 75 66 20 2b 3d 20 6e 57 pLog->nBuf += nW
53d0: 72 69 74 65 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 rite;.}..void sq
53e0: 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 62 69 lite3_instvfs_bi
53f0: 6e 61 72 79 6c 6f 67 5f 6d 61 72 6b 65 72 28 0a narylog_marker(.
5400: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 sqlite3_vfs *p
5410: 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 Vfs,. const cha
5420: 72 20 2a 7a 4d 61 72 6b 65 72 0a 29 7b 0a 20 20 r *zMarker.){.
5430: 49 6e 73 74 56 66 73 20 2a 70 49 6e 73 74 56 66 InstVfs *pInstVf
5440: 73 20 3d 20 28 49 6e 73 74 56 66 73 20 2a 29 70 s = (InstVfs *)p
5450: 56 66 73 3b 0a 20 20 49 6e 73 74 56 66 73 42 69 Vfs;. InstVfsBi
5460: 6e 61 72 79 4c 6f 67 20 2a 70 4c 6f 67 20 3d 20 naryLog *pLog =
5470: 28 49 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f (InstVfsBinaryLo
5480: 67 20 2a 29 70 49 6e 73 74 56 66 73 2d 3e 70 43 g *)pInstVfs->pC
5490: 6c 69 65 6e 74 3b 0a 20 20 62 69 6e 61 72 79 6c lient;. binaryl
54a0: 6f 67 5f 62 6c 6f 62 28 70 56 66 73 2c 20 7a 4d og_blob(pVfs, zM
54b0: 61 72 6b 65 72 2c 20 2d 31 29 3b 0a 20 20 62 69 arker, -1);. bi
54c0: 6e 61 72 79 6c 6f 67 5f 78 63 61 6c 6c 28 70 4c narylog_xcall(pL
54d0: 6f 67 2c 20 42 49 4e 41 52 59 4c 4f 47 5f 4d 41 og, BINARYLOG_MA
54e0: 52 4b 45 52 2c 20 30 2c 20 30 2c 20 30 2c 20 30 RKER, 0, 0, 0, 0
54f0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 73 , 0, 0, 0);.}..s
5500: 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 qlite3_vfs *sqli
5510: 74 65 33 5f 69 6e 73 74 76 66 73 5f 62 69 6e 61 te3_instvfs_bina
5520: 72 79 6c 6f 67 28 0a 20 20 63 6f 6e 73 74 20 63 rylog(. const c
5530: 68 61 72 20 2a 7a 56 66 73 2c 0a 20 20 63 6f 6e har *zVfs,. con
5540: 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 st char *zParent
5550: 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 Vfs, . const ch
5560: 61 72 20 2a 7a 4c 6f 67 0a 29 7b 0a 20 20 49 6e ar *zLog.){. In
5570: 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 2a stVfsBinaryLog *
5580: 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 p;. sqlite3_vfs
5590: 20 2a 70 56 66 73 3b 0a 20 20 73 71 6c 69 74 65 *pVfs;. sqlite
55a0: 33 5f 76 66 73 20 2a 70 50 61 72 65 6e 74 3b 0a 3_vfs *pParent;.
55b0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 int nByte;. i
55c0: 6e 74 20 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 nt flags;. int
55d0: 72 63 3b 0a 0a 20 20 70 50 61 72 65 6e 74 20 3d rc;.. pParent =
55e0: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e sqlite3_vfs_fin
55f0: 64 28 7a 50 61 72 65 6e 74 56 66 73 29 3b 0a 20 d(zParentVfs);.
5600: 20 69 66 28 20 21 70 50 61 72 65 6e 74 20 29 7b if( !pParent ){
5610: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 . return 0;.
5620: 20 7d 0a 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 }.. nByte = si
5630: 7a 65 6f 66 28 49 6e 73 74 56 66 73 42 69 6e 61 zeof(InstVfsBina
5640: 72 79 4c 6f 67 29 20 2b 20 70 50 61 72 65 6e 74 ryLog) + pParent
5650: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a ->mxPathname+1;.
5660: 20 20 70 20 3d 20 28 49 6e 73 74 56 66 73 42 69 p = (InstVfsBi
5670: 6e 61 72 79 4c 6f 67 20 2a 29 73 71 6c 69 74 65 naryLog *)sqlite
5680: 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 3_malloc(nByte);
5690: 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 . memset(p, 0,
56a0: 6e 42 79 74 65 29 3b 0a 20 20 70 2d 3e 7a 42 75 nByte);. p->zBu
56b0: 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c f = sqlite3_mall
56c0: 6f 63 28 42 49 4e 41 52 59 4c 4f 47 5f 42 55 46 oc(BINARYLOG_BUF
56d0: 46 45 52 53 49 5a 45 29 3b 0a 20 20 70 2d 3e 7a FERSIZE);. p->z
56e0: 4f 75 74 20 3d 20 28 63 68 61 72 20 2a 29 26 70 Out = (char *)&p
56f0: 5b 31 5d 3b 0a 20 20 70 2d 3e 70 4f 75 74 20 3d [1];. p->pOut =
5700: 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a (sqlite3_file *
5710: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 )sqlite3_malloc(
5720: 70 50 61 72 65 6e 74 2d 3e 73 7a 4f 73 46 69 6c pParent->szOsFil
5730: 65 29 3b 0a 20 20 70 50 61 72 65 6e 74 2d 3e 78 e);. pParent->x
5740: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 50 61 FullPathname(pPa
5750: 72 65 6e 74 2c 20 7a 4c 6f 67 2c 20 70 50 61 72 rent, zLog, pPar
5760: 65 6e 74 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c ent->mxPathname,
5770: 20 70 2d 3e 7a 4f 75 74 29 3b 0a 20 20 66 6c 61 p->zOut);. fla
5780: 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e gs = SQLITE_OPEN
5790: 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 _READWRITE|SQLIT
57a0: 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 E_OPEN_CREATE|SQ
57b0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 LITE_OPEN_MASTER
57c0: 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 70 50 61 72 _JOURNAL;. pPar
57d0: 65 6e 74 2d 3e 78 44 65 6c 65 74 65 28 70 50 61 ent->xDelete(pPa
57e0: 72 65 6e 74 2c 20 70 2d 3e 7a 4f 75 74 2c 20 30 rent, p->zOut, 0
57f0: 29 3b 0a 20 20 72 63 20 3d 20 70 50 61 72 65 6e );. rc = pParen
5800: 74 2d 3e 78 4f 70 65 6e 28 70 50 61 72 65 6e 74 t->xOpen(pParent
5810: 2c 20 70 2d 3e 7a 4f 75 74 2c 20 70 2d 3e 70 4f , p->zOut, p->pO
5820: 75 74 2c 20 66 6c 61 67 73 2c 20 26 66 6c 61 67 ut, flags, &flag
5830: 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 s);. if( rc==SQ
5840: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 LITE_OK ){. r
5850: 63 20 3d 20 70 2d 3e 70 4f 75 74 2d 3e 70 4d 65 c = p->pOut->pMe
5860: 74 68 6f 64 73 2d 3e 78 57 72 69 74 65 28 70 2d thods->xWrite(p-
5870: 3e 70 4f 75 74 2c 20 22 73 71 6c 69 74 65 5f 6f >pOut, "sqlite_o
5880: 73 74 72 61 63 65 31 2e 2e 2e 2e 2e 22 2c 20 32 strace1.....", 2
5890: 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 69 4f 0, 0);. p->iO
58a0: 66 66 73 65 74 20 3d 20 32 30 3b 0a 20 20 7d 0a ffset = 20;. }.
58b0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 if( rc ){.
58c0: 62 69 6e 61 72 79 6c 6f 67 5f 78 64 65 6c 28 70 binarylog_xdel(p
58d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b );. return 0;
58e0: 0a 20 20 7d 0a 0a 20 20 70 56 66 73 20 3d 20 73 . }.. pVfs = s
58f0: 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 63 qlite3_instvfs_c
5900: 72 65 61 74 65 28 7a 56 66 73 2c 20 7a 50 61 72 reate(zVfs, zPar
5910: 65 6e 74 56 66 73 29 3b 0a 20 20 69 66 28 20 70 entVfs);. if( p
5920: 56 66 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 Vfs ){. sqlit
5930: 65 33 5f 69 6e 73 74 76 66 73 5f 63 6f 6e 66 69 e3_instvfs_confi
5940: 67 75 72 65 28 70 56 66 73 2c 20 62 69 6e 61 72 gure(pVfs, binar
5950: 79 6c 6f 67 5f 78 63 61 6c 6c 2c 20 70 2c 20 62 ylog_xcall, p, b
5960: 69 6e 61 72 79 6c 6f 67 5f 78 64 65 6c 29 3b 0a inarylog_xdel);.
5970: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 56 }.. return pV
5980: 66 73 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a fs;.}../********
5990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
59a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
59b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
59c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
59d0: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **.*************
59e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
59f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a **************.*
5a20: 2a 20 54 63 6c 20 69 6e 74 65 72 66 61 63 65 20 * Tcl interface
5a30: 73 74 61 72 74 73 20 68 65 72 65 2e 0a 2a 2f 0a starts here..*/.
5a40: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a #if SQLITE_TEST.
5a50: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68 .#include <tcl.h
5a60: 3e 0a 0a 73 74 72 75 63 74 20 49 6e 73 74 56 66 >..struct InstVf
5a70: 73 43 61 6c 6c 20 7b 0a 20 20 54 63 6c 5f 49 6e sCall {. Tcl_In
5a80: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 terp *interp;.
5a90: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 Tcl_Obj *pScript
5aa0: 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72 ;.};.typedef str
5ab0: 75 63 74 20 49 6e 73 74 56 66 73 43 61 6c 6c 20 uct InstVfsCall
5ac0: 49 6e 73 74 56 66 73 43 61 6c 6c 3b 0a 0a 73 74 InstVfsCall;..st
5ad0: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 69 atic void test_i
5ae0: 6e 73 74 76 66 73 5f 78 63 61 6c 6c 28 0a 20 20 nstvfs_xcall(.
5af0: 76 6f 69 64 20 2a 70 2c 0a 20 20 69 6e 74 20 65 void *p,. int e
5b00: 45 76 65 6e 74 2c 0a 20 20 69 6e 74 20 69 46 69 Event,. int iFi
5b10: 6c 65 49 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f leId,. sqlite3_
5b20: 69 6e 74 36 34 20 6e 43 6c 69 63 6b 2c 0a 20 20 int64 nClick,.
5b30: 69 6e 74 20 72 65 74 75 72 6e 5f 63 6f 64 65 2c int return_code,
5b40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
5b50: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67 Name,. int flag
5b60: 73 2c 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 0a s,. int nByte,.
5b70: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 sqlite3_int64
5b80: 69 4f 66 66 73 65 74 0a 29 7b 0a 20 20 69 6e 74 iOffset.){. int
5b90: 20 72 63 3b 0a 20 20 49 6e 73 74 56 66 73 43 61 rc;. InstVfsCa
5ba0: 6c 6c 20 2a 70 43 61 6c 6c 20 3d 20 28 49 6e 73 ll *pCall = (Ins
5bb0: 74 56 66 73 43 61 6c 6c 20 2a 29 70 3b 0a 20 20 tVfsCall *)p;.
5bc0: 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 20 3d 20 Tcl_Obj *pObj =
5bd0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a Tcl_DuplicateObj
5be0: 28 20 70 43 61 6c 6c 2d 3e 70 53 63 72 69 70 74 ( pCall->pScript
5bf0: 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 );. const char
5c00: 2a 7a 45 76 65 6e 74 20 3d 20 73 71 6c 69 74 65 *zEvent = sqlite
5c10: 33 5f 69 6e 73 74 76 66 73 5f 6e 61 6d 65 28 65 3_instvfs_name(e
5c20: 45 76 65 6e 74 29 3b 0a 0a 20 20 54 63 6c 5f 49 Event);.. Tcl_I
5c30: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 4f 62 6a ncrRefCount(pObj
5c40: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a );. Tcl_ListObj
5c50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c AppendElement(0,
5c60: 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 pObj, Tcl_NewSt
5c70: 72 69 6e 67 4f 62 6a 28 7a 45 76 65 6e 74 2c 20 ringObj(zEvent,
5c80: 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 -1));. Tcl_List
5c90: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
5ca0: 28 30 2c 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65 (0, pObj, Tcl_Ne
5cb0: 77 57 69 64 65 49 6e 74 4f 62 6a 28 6e 43 6c 69 wWideIntObj(nCli
5cc0: 63 6b 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 ck));. Tcl_List
5cd0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
5ce0: 28 30 2c 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65 (0, pObj, Tcl_Ne
5cf0: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 wStringObj(zName
5d00: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 , -1));. Tcl_Li
5d10: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
5d20: 6e 74 28 30 2c 20 70 4f 62 6a 2c 20 54 63 6c 5f nt(0, pObj, Tcl_
5d30: 4e 65 77 49 6e 74 4f 62 6a 28 6e 42 79 74 65 29 NewIntObj(nByte)
5d40: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a );. Tcl_ListObj
5d50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c AppendElement(0,
5d60: 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 57 69 pObj, Tcl_NewWi
5d70: 64 65 49 6e 74 4f 62 6a 28 69 4f 66 66 73 65 74 deIntObj(iOffset
5d80: 29 29 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f ));.. rc = Tcl_
5d90: 45 76 61 6c 4f 62 6a 45 78 28 70 43 61 6c 6c 2d EvalObjEx(pCall-
5da0: 3e 69 6e 74 65 72 70 2c 20 70 4f 62 6a 2c 20 54 >interp, pObj, T
5db0: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 CL_EVAL_GLOBAL|T
5dc0: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b CL_EVAL_DIRECT);
5dd0: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 . if( rc ){.
5de0: 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 Tcl_BackgroundE
5df0: 72 72 6f 72 28 70 43 61 6c 6c 2d 3e 69 6e 74 65 rror(pCall->inte
5e00: 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 rp);. }. Tcl_D
5e10: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 4f 62 6a ecrRefCount(pObj
5e20: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 );.}..static voi
5e30: 64 20 74 65 73 74 5f 69 6e 73 74 76 66 73 5f 78 d test_instvfs_x
5e40: 64 65 6c 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 del(void *p){.
5e50: 49 6e 73 74 56 66 73 43 61 6c 6c 20 2a 70 43 61 InstVfsCall *pCa
5e60: 6c 6c 20 3d 20 28 49 6e 73 74 56 66 73 43 61 6c ll = (InstVfsCal
5e70: 6c 20 2a 29 70 3b 0a 20 20 54 63 6c 5f 44 65 63 l *)p;. Tcl_Dec
5e80: 72 52 65 66 43 6f 75 6e 74 28 70 43 61 6c 6c 2d rRefCount(pCall-
5e90: 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 73 71 6c >pScript);. sql
5ea0: 69 74 65 33 5f 66 72 65 65 28 70 43 61 6c 6c 29 ite3_free(pCall)
5eb0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 ;.}..static int
5ec0: 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 69 6e 73 test_sqlite3_ins
5ed0: 74 76 66 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 tvfs(. void * c
5ee0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c lientData,. Tcl
5ef0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
5f00: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 . int objc,. T
5f10: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 cl_Obj *CONST ob
5f20: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69 63 jv[].){. static
5f30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 49 56 5f const char *IV_
5f40: 73 74 72 73 5b 5d 20 3d 20 0a 20 20 20 20 20 20 strs[] = .
5f50: 20 20 20 20 20 20 20 20 20 7b 20 22 63 72 65 61 { "crea
5f60: 74 65 22 2c 20 20 22 64 65 73 74 72 6f 79 22 2c te", "destroy",
5f70: 20 20 22 72 65 73 65 74 22 2c 20 20 22 72 65 70 "reset", "rep
5f80: 6f 72 74 22 2c 20 22 63 6f 6e 66 69 67 75 72 65 ort", "configure
5f90: 22 2c 20 22 62 69 6e 61 72 79 6c 6f 67 22 2c 20 ", "binarylog",
5fa0: 22 6d 61 72 6b 65 72 22 2c 20 30 20 7d 3b 0a 20 "marker", 0 };.
5fb0: 20 65 6e 75 6d 20 49 56 5f 65 6e 75 6d 20 7b 20 enum IV_enum {
5fc0: 49 56 5f 43 52 45 41 54 45 2c 20 49 56 5f 44 45 IV_CREATE, IV_DE
5fd0: 53 54 52 4f 59 2c 20 49 56 5f 52 45 53 45 54 2c STROY, IV_RESET,
5fe0: 20 49 56 5f 52 45 50 4f 52 54 2c 20 49 56 5f 43 IV_REPORT, IV_C
5ff0: 4f 4e 46 49 47 55 52 45 2c 20 49 56 5f 42 49 4e ONFIGURE, IV_BIN
6000: 41 52 59 4c 4f 47 2c 20 49 56 5f 4d 41 52 4b 45 ARYLOG, IV_MARKE
6010: 52 20 7d 3b 0a 20 20 69 6e 74 20 69 53 75 62 3b R };. int iSub;
6020: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 .. if( objc<2 )
6030: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e {. Tcl_WrongN
6040: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
6050: 2c 20 6f 62 6a 76 2c 20 22 53 55 42 2d 43 4f 4d , objv, "SUB-COM
6060: 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 7d 0a MAND ...");. }.
6070: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 if( Tcl_GetInd
6080: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 exFromObj(interp
6090: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 49 56 5f 73 74 , objv[1], IV_st
60a0: 72 73 2c 20 22 73 75 62 2d 63 6f 6d 6d 61 6e 64 rs, "sub-command
60b0: 22 2c 20 30 2c 20 26 69 53 75 62 29 20 29 7b 0a ", 0, &iSub) ){.
60c0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
60d0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 RROR;. }.. swi
60e0: 74 63 68 28 20 28 65 6e 75 6d 20 49 56 5f 65 6e tch( (enum IV_en
60f0: 75 6d 29 69 53 75 62 20 29 7b 0a 20 20 20 20 63 um)iSub ){. c
6100: 61 73 65 20 49 56 5f 43 52 45 41 54 45 3a 20 7b ase IV_CREATE: {
6110: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 61 . char *zPa
6120: 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 rent = 0;.
6130: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 3b 0a sqlite3_vfs *p;.
6140: 20 20 20 20 20 20 69 6e 74 20 69 73 44 65 66 61 int isDefa
6150: 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 ult = 0;. i
6160: 66 28 20 6f 62 6a 63 3e 32 20 26 26 20 30 3d 3d f( objc>2 && 0==
6170: 73 74 72 63 6d 70 28 22 2d 64 65 66 61 75 6c 74 strcmp("-default
6180: 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 ", Tcl_GetString
6190: 28 6f 62 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20 (objv[2])) ){.
61a0: 20 20 20 20 20 20 69 73 44 65 66 61 75 6c 74 20 isDefault
61b0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 = 1;. }.
61c0: 20 20 20 69 66 28 20 28 6f 62 6a 63 2d 69 73 44 if( (objc-isD
61d0: 65 66 61 75 6c 74 29 21 3d 34 20 26 26 20 28 6f efault)!=4 && (o
61e0: 62 6a 63 2d 69 73 44 65 66 61 75 6c 74 29 21 3d bjc-isDefault)!=
61f0: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 3 ){. Tcl
6200: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
6210: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 terp, 2, objv, "
6220: 3f 2d 64 65 66 61 75 6c 74 3f 20 4e 41 4d 45 20 ?-default? NAME
6230: 3f 50 41 52 45 4e 54 2d 56 46 53 3f 22 29 3b 0a ?PARENT-VFS?");.
6240: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 return T
6250: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 CL_ERROR;.
6260: 7d 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 }. if( objc
6270: 3d 3d 28 34 2b 69 73 44 65 66 61 75 6c 74 29 20 ==(4+isDefault)
6280: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 61 72 65 ){. zPare
6290: 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 nt = Tcl_GetStri
62a0: 6e 67 28 6f 62 6a 76 5b 33 2b 69 73 44 65 66 61 ng(objv[3+isDefa
62b0: 75 6c 74 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 ult]);. }.
62c0: 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 p = sqlite3
62d0: 5f 69 6e 73 74 76 66 73 5f 63 72 65 61 74 65 28 _instvfs_create(
62e0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
62f0: 6a 76 5b 32 2b 69 73 44 65 66 61 75 6c 74 5d 29 jv[2+isDefault])
6300: 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 , zParent);.
6310: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 if( !p ){.
6320: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
6330: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65 72 sult(interp, "er
6340: 72 6f 72 20 63 72 65 61 74 69 6e 67 20 76 66 73 ror creating vfs
6350: 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 ", 0);.
6360: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
6370: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
6380: 69 66 28 20 69 73 44 65 66 61 75 6c 74 20 29 7b if( isDefault ){
6390: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 . sqlite3
63a0: 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 70 2c _vfs_register(p,
63b0: 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 1);. }.
63c0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
63d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 ult(interp, objv
63e0: 5b 32 5d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 [2]);. brea
63f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 k;. }. cas
6400: 65 20 49 56 5f 42 49 4e 41 52 59 4c 4f 47 3a 20 e IV_BINARYLOG:
6410: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e {. char *zN
6420: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 ame = 0;. c
6430: 68 61 72 20 2a 7a 4c 6f 67 20 3d 20 30 3b 0a 20 har *zLog = 0;.
6440: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 sqlite3_vfs
6450: 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 *p;. int i
6460: 73 44 65 66 61 75 6c 74 20 3d 20 30 3b 0a 20 20 sDefault = 0;.
6470: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 32 20 26 if( objc>2 &
6480: 26 20 30 3d 3d 73 74 72 63 6d 70 28 22 2d 64 65 & 0==strcmp("-de
6490: 66 61 75 6c 74 22 2c 20 54 63 6c 5f 47 65 74 53 fault", Tcl_GetS
64a0: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20 tring(objv[2]))
64b0: 29 7b 0a 20 20 20 20 20 20 20 20 69 73 44 65 66 ){. isDef
64c0: 61 75 6c 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 ault = 1;.
64d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62 6a }. if( (obj
64e0: 63 2d 69 73 44 65 66 61 75 6c 74 29 21 3d 34 20 c-isDefault)!=4
64f0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 ){. Tcl_W
6500: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
6510: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d rp, 2, objv, "?-
6520: 64 65 66 61 75 6c 74 3f 20 4e 41 4d 45 20 4c 4f default? NAME LO
6530: 47 46 49 4c 45 22 29 3b 0a 20 20 20 20 20 20 20 GFILE");.
6540: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
6550: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 R;. }.
6560: 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 zName = Tcl_Get
6570: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 2b 69 73 String(objv[2+is
6580: 44 65 66 61 75 6c 74 5d 29 3b 0a 20 20 20 20 20 Default]);.
6590: 20 7a 4c 6f 67 20 3d 20 54 63 6c 5f 47 65 74 53 zLog = Tcl_GetS
65a0: 74 72 69 6e 67 28 6f 62 6a 76 5b 33 2b 69 73 44 tring(objv[3+isD
65b0: 65 66 61 75 6c 74 5d 29 3b 0a 20 20 20 20 20 20 efault]);.
65c0: 70 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 p = sqlite3_inst
65d0: 76 66 73 5f 62 69 6e 61 72 79 6c 6f 67 28 7a 4e vfs_binarylog(zN
65e0: 61 6d 65 2c 20 30 2c 20 7a 4c 6f 67 29 3b 0a 20 ame, 0, zLog);.
65f0: 20 20 20 20 20 69 66 28 20 21 70 20 29 7b 0a 20 if( !p ){.
6600: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e Tcl_Appen
6610: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
6620: 22 65 72 72 6f 72 20 63 72 65 61 74 69 6e 67 20 "error creating
6630: 76 66 73 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 vfs ", 0);.
6640: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
6650: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 ROR;. }.
6660: 20 20 20 69 66 28 20 69 73 44 65 66 61 75 6c 74 if( isDefault
6670: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 ){. sqli
6680: 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 te3_vfs_register
6690: 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a (p, 1);. }.
66a0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a Tcl_SetObj
66b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f Result(interp, o
66c0: 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 62 bjv[2]);. b
66d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 reak;. }..
66e0: 20 63 61 73 65 20 49 56 5f 4d 41 52 4b 45 52 3a case IV_MARKER:
66f0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 {. sqlite3
6700: 5f 76 66 73 20 2a 70 3b 0a 20 20 20 20 20 20 69 _vfs *p;. i
6710: 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 f( objc!=4 ){.
6720: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e Tcl_WrongN
6730: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 umArgs(interp, 2
6740: 2c 20 6f 62 6a 76 2c 20 22 56 46 53 20 4d 41 52 , objv, "VFS MAR
6750: 4b 45 52 22 29 3b 0a 20 20 20 20 20 20 20 20 72 KER");. r
6760: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
6770: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 . }. p
6780: 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 = sqlite3_vfs_f
6790: 69 6e 64 28 54 63 6c 5f 47 65 74 53 74 72 69 6e ind(Tcl_GetStrin
67a0: 67 28 6f 62 6a 76 5b 32 5d 29 29 3b 0a 20 20 20 g(objv[2]));.
67b0: 20 20 20 69 66 28 20 21 70 20 7c 7c 20 70 2d 3e if( !p || p->
67c0: 78 4f 70 65 6e 21 3d 69 6e 73 74 4f 70 65 6e 20 xOpen!=instOpen
67d0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 ){. Tcl_A
67e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
67f0: 72 70 2c 20 22 6e 6f 20 73 75 63 68 20 76 66 73 rp, "no such vfs
6800: 3a 20 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 : ", Tcl_GetStri
6810: 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 30 29 3b ng(objv[2]), 0);
6820: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 . return
6830: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 TCL_ERROR;.
6840: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 }. sqlite3
6850: 5f 69 6e 73 74 76 66 73 5f 62 69 6e 61 72 79 6c _instvfs_binaryl
6860: 6f 67 5f 6d 61 72 6b 65 72 28 70 2c 20 54 63 6c og_marker(p, Tcl
6870: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
6880: 33 5d 29 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 3]));. Tcl_
6890: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 ResetResult(inte
68a0: 72 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b rp);. break
68b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 ;. }.. cas
68c0: 65 20 49 56 5f 43 4f 4e 46 49 47 55 52 45 3a 20 e IV_CONFIGURE:
68d0: 7b 0a 20 20 20 20 20 20 49 6e 73 74 56 66 73 43 {. InstVfsC
68e0: 61 6c 6c 20 2a 70 43 61 6c 6c 3b 0a 0a 20 20 20 all *pCall;..
68f0: 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a sqlite3_vfs *
6900: 70 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a p;. if( obj
6910: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 c!=4 ){.
6920: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
6930: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 (interp, 2, objv
6940: 2c 20 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29 , "NAME SCRIPT")
6950: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e ;. return
6960: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
6970: 20 20 7d 0a 20 20 20 20 20 20 70 20 3d 20 73 71 }. p = sq
6980: 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 54 lite3_vfs_find(T
6990: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a cl_GetString(obj
69a0: 76 5b 32 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 v[2]));. if
69b0: 28 20 21 70 20 7c 7c 20 70 2d 3e 78 4f 70 65 6e ( !p || p->xOpen
69c0: 21 3d 69 6e 73 74 4f 70 65 6e 20 29 7b 0a 20 20 !=instOpen ){.
69d0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 Tcl_Append
69e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
69f0: 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 22 2c 20 no such vfs: ",
6a00: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
6a10: 6a 76 5b 32 5d 29 2c 20 30 29 3b 0a 20 20 20 20 jv[2]), 0);.
6a20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
6a30: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 RROR;. }..
6a40: 20 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e 28 if( strlen(
6a50: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
6a60: 6a 76 5b 33 5d 29 29 20 29 7b 0a 20 20 20 20 20 jv[3])) ){.
6a70: 20 20 20 70 43 61 6c 6c 20 3d 20 28 49 6e 73 74 pCall = (Inst
6a80: 56 66 73 43 61 6c 6c 20 2a 29 73 71 6c 69 74 65 VfsCall *)sqlite
6a90: 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 3_malloc(sizeof(
6aa0: 49 6e 73 74 56 66 73 43 61 6c 6c 29 29 3b 0a 20 InstVfsCall));.
6ab0: 20 20 20 20 20 20 20 70 43 61 6c 6c 2d 3e 69 6e pCall->in
6ac0: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 terp = interp;.
6ad0: 20 20 20 20 20 20 20 70 43 61 6c 6c 2d 3e 70 53 pCall->pS
6ae0: 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c cript = Tcl_Dupl
6af0: 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 33 5d icateObj(objv[3]
6b00: 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 );. Tcl_I
6b10: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 61 6c ncrRefCount(pCal
6b20: 6c 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20 l->pScript);.
6b30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 sqlite3_ins
6b40: 74 76 66 73 5f 63 6f 6e 66 69 67 75 72 65 28 70 tvfs_configure(p
6b50: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 , . t
6b60: 65 73 74 5f 69 6e 73 74 76 66 73 5f 78 63 61 6c est_instvfs_xcal
6b70: 6c 2c 20 28 76 6f 69 64 20 2a 29 70 43 61 6c 6c l, (void *)pCall
6b80: 2c 20 74 65 73 74 5f 69 6e 73 74 76 66 73 5f 78 , test_instvfs_x
6b90: 64 65 6c 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 del. );.
6ba0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{.
6bb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 sqlite3_inst
6bc0: 76 66 73 5f 63 6f 6e 66 69 67 75 72 65 28 70 2c vfs_configure(p,
6bd0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 0, 0, 0);.
6be0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a }. break;.
6bf0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 }.. case
6c00: 49 56 5f 52 45 50 4f 52 54 3a 0a 20 20 20 20 63 IV_REPORT:. c
6c10: 61 73 65 20 49 56 5f 44 45 53 54 52 4f 59 3a 0a ase IV_DESTROY:.
6c20: 20 20 20 20 63 61 73 65 20 49 56 5f 52 45 53 45 case IV_RESE
6c30: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 T: {. sqlit
6c40: 65 33 5f 76 66 73 20 2a 70 3b 0a 20 20 20 20 20 e3_vfs *p;.
6c50: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a if( objc!=3 ){.
6c60: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e Tcl_Wron
6c70: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
6c80: 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 22 2, objv, "NAME"
6c90: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 );. retur
6ca0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
6cb0: 20 20 20 7d 0a 20 20 20 20 20 20 70 20 3d 20 73 }. p = s
6cc0: 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 qlite3_vfs_find(
6cd0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
6ce0: 6a 76 5b 32 5d 29 29 3b 0a 20 20 20 20 20 20 69 jv[2]));. i
6cf0: 66 28 20 21 70 20 7c 7c 20 70 2d 3e 78 4f 70 65 f( !p || p->xOpe
6d00: 6e 21 3d 69 6e 73 74 4f 70 65 6e 20 29 7b 0a 20 n!=instOpen ){.
6d10: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e Tcl_Appen
6d20: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
6d30: 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 22 2c "no such vfs: ",
6d40: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f Tcl_GetString(o
6d50: 62 6a 76 5b 32 5d 29 2c 20 30 29 3b 0a 20 20 20 bjv[2]), 0);.
6d60: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f return TCL_
6d70: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 0a ERROR;. }..
6d80: 20 20 20 20 20 20 69 66 28 20 28 28 65 6e 75 6d if( ((enum
6d90: 20 49 56 5f 65 6e 75 6d 29 69 53 75 62 29 3d 3d IV_enum)iSub)==
6da0: 49 56 5f 44 45 53 54 52 4f 59 20 29 7b 0a 20 20 IV_DESTROY ){.
6db0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e sqlite3_in
6dc0: 73 74 76 66 73 5f 64 65 73 74 72 6f 79 28 70 29 stvfs_destroy(p)
6dd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
6de0: 69 66 28 20 28 28 65 6e 75 6d 20 49 56 5f 65 6e if( ((enum IV_en
6df0: 75 6d 29 69 53 75 62 29 3d 3d 49 56 5f 52 45 53 um)iSub)==IV_RES
6e00: 45 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 ET ){. sq
6e10: 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 72 65 lite3_instvfs_re
6e20: 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a set(p);. }.
6e30: 20 20 20 20 20 20 69 66 28 20 28 28 65 6e 75 6d if( ((enum
6e40: 20 49 56 5f 65 6e 75 6d 29 69 53 75 62 29 3d 3d IV_enum)iSub)==
6e50: 49 56 5f 52 45 50 4f 52 54 20 29 7b 0a 20 20 20 IV_REPORT ){.
6e60: 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 int ii;.
6e70: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 Tcl_Obj *pR
6e80: 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 et = Tcl_NewObj(
6e90: 29 3b 0a 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 );.. cons
6ea0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 t char *zName =
6eb0: 28 63 68 61 72 20 2a 29 31 3b 0a 20 20 20 20 20 (char *)1;.
6ec0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 sqlite3_int64
6ed0: 20 6e 43 6c 69 63 6b 3b 0a 20 20 20 20 20 20 20 nClick;.
6ee0: 20 69 6e 74 20 6e 43 61 6c 6c 3b 0a 20 20 20 20 int nCall;.
6ef0: 20 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 7a 4e for(ii=1; zN
6f00: 61 6d 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 ame; ii++){.
6f10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e sqlite3_in
6f20: 73 74 76 66 73 5f 67 65 74 28 70 2c 20 69 69 2c stvfs_get(p, ii,
6f30: 20 26 7a 4e 61 6d 65 2c 20 26 6e 43 6c 69 63 6b &zName, &nClick
6f40: 2c 20 26 6e 43 61 6c 6c 29 3b 0a 20 20 20 20 20 , &nCall);.
6f50: 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 if( zName )
6f60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63 {. Tc
6f70: 6c 5f 4f 62 6a 20 2a 70 45 6c 65 6d 20 3d 20 54 l_Obj *pElem = T
6f80: 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 cl_NewObj();.
6f90: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 Tcl_Lis
6fa0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
6fb0: 74 28 30 2c 20 70 45 6c 65 6d 2c 20 54 63 6c 5f t(0, pElem, Tcl_
6fc0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 NewStringObj(zNa
6fd0: 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 me, -1));.
6fe0: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 Tcl_ListOb
6ff0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 jAppendElement(0
7000: 2c 20 70 45 6c 65 6d 2c 20 54 63 6c 5f 4e 65 77 , pElem, Tcl_New
7010: 49 6e 74 4f 62 6a 28 6e 43 61 6c 6c 29 29 3b 0a IntObj(nCall));.
7020: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f Tcl_
7030: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
7040: 6d 65 6e 74 28 30 2c 20 70 45 6c 65 6d 2c 20 54 ment(0, pElem, T
7050: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a cl_NewWideIntObj
7060: 28 6e 43 6c 69 63 6b 29 29 3b 0a 20 20 20 20 20 (nClick));.
7070: 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f Tcl_ListO
7080: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
7090: 30 2c 20 70 52 65 74 2c 20 70 45 6c 65 6d 29 3b 0, pRet, pElem);
70a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 . }.
70b0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 }..
70c0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
70d0: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a (interp, pRet);.
70e0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 }.. b
70f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a reak;. }. }.
7100: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b . return TCL_OK
7110: 3b 0a 7d 0a 0a 69 6e 74 20 53 71 6c 69 74 65 74 ;.}..int Sqlitet
7120: 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54 estOsinst_Init(T
7130: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
7140: 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 p){. Tcl_Create
7150: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
7160: 70 2c 20 22 73 71 6c 69 74 65 33 5f 69 6e 73 74 p, "sqlite3_inst
7170: 76 66 73 22 2c 20 74 65 73 74 5f 73 71 6c 69 74 vfs", test_sqlit
7180: 65 33 5f 69 6e 73 74 76 66 73 2c 20 30 2c 20 30 e3_instvfs, 0, 0
7190: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f );. return TCL_
71a0: 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a OK;.}..#endif.