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 0a 2a 2a 20 54 63 6c 20 69 6e 74 65 72 .**.** Tcl inter
0320: 66 61 63 65 20 28 6f 6d 69 74 74 65 64 20 69 66 face (omitted if
0330: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 SQLITE_TEST is
0340: 6e 6f 74 20 73 65 74 29 3a 0a 2a 2a 20 0a 2a 2a not set):.** .**
0350: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 sqlite3_instv
0360: 66 73 20 63 72 65 61 74 65 20 4e 41 4d 45 20 3f fs create NAME ?
0370: 50 41 52 45 4e 54 3f 0a 2a 2a 0a 2a 2a 20 20 20 PARENT?.**.**
0380: 20 20 20 20 43 72 65 61 74 65 20 61 6e 64 20 72 Create and r
0390: 65 67 69 73 74 65 72 20 6e 65 77 20 76 66 73 20 egister new vfs
03a0: 63 61 6c 6c 65 64 20 24 4e 41 4d 45 2c 20 77 68 called $NAME, wh
03b0: 69 63 68 20 69 73 20 61 20 77 72 61 70 70 65 72 ich is a wrapper
03c0: 20 61 72 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 around.**
03d0: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 76 66 the existing vf
03e0: 73 20 24 50 41 52 45 4e 54 2e 20 49 66 20 74 68 s $PARENT. If th
03f0: 65 20 50 41 52 45 4e 54 20 61 72 67 75 6d 65 6e e PARENT argumen
0400: 74 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 74 68 t is omitted, th
0410: 65 0a 2a 2a 20 20 20 20 20 20 20 6e 65 77 20 76 e.** new v
0420: 66 73 20 69 73 20 61 20 77 72 61 70 70 65 72 20 fs is a wrapper
0430: 61 72 6f 75 6e 64 20 74 68 65 20 63 75 72 72 65 around the curre
0440: 6e 74 20 64 65 66 61 75 6c 74 20 76 66 73 2e 0a nt default vfs..
0450: 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f **.** sqlite3_
0460: 69 6e 73 74 76 66 73 20 64 65 73 74 72 6f 79 20 instvfs destroy
0470: 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 NAME.**.**
0480: 20 44 65 72 65 67 69 73 74 65 72 20 61 6e 64 20 Deregister and
0490: 64 65 73 74 72 6f 79 20 74 68 65 20 76 66 73 20 destroy the vfs
04a0: 6e 61 6d 65 64 20 24 4e 41 4d 45 2c 20 77 68 69 named $NAME, whi
04b0: 63 68 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 ch must have bee
04c0: 6e 0a 2a 2a 20 20 20 20 20 20 20 63 72 65 61 74 n.** creat
04d0: 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 ed by an earlier
04e0: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 5b invocation of [
04f0: 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 20 sqlite3_instvfs
0500: 63 72 65 61 74 65 5d 2e 0a 2a 2a 0a 2a 2a 20 20 create]..**.**
0510: 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 sqlite3_instvfs
0520: 20 63 6f 6e 66 69 67 75 72 65 20 4e 41 4d 45 20 configure NAME
0530: 53 43 52 49 50 54 0a 2a 2a 0a 2a 2a 20 20 20 20 SCRIPT.**.**
0540: 20 20 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 Configure the
0550: 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 callback script
0560: 20 66 6f 72 20 74 68 65 20 76 66 73 20 24 4e 41 for the vfs $NA
0570: 4d 45 2c 20 77 68 69 63 68 20 6d 75 63 68 20 68 ME, which much h
0580: 61 76 65 0a 2a 2a 20 20 20 20 20 20 20 62 65 65 ave.** bee
0590: 6e 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 n created by an
05a0: 65 61 72 6c 69 65 72 20 69 6e 76 6f 63 61 74 69 earlier invocati
05b0: 6f 6e 20 6f 66 20 5b 73 71 6c 69 74 65 33 5f 69 on of [sqlite3_i
05c0: 6e 73 74 76 66 73 20 63 72 65 61 74 65 5d 2e 0a nstvfs create]..
05d0: 2a 2a 20 20 20 20 20 20 20 41 66 74 65 72 20 61 ** After a
05e0: 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 callback script
05f0: 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 has been config
0600: 75 72 65 64 2c 20 69 74 20 69 73 20 69 6e 76 6f ured, it is invo
0610: 6b 65 64 20 65 61 63 68 0a 2a 2a 20 20 20 20 20 ked each.**
0620: 20 20 74 69 6d 65 20 61 20 76 66 73 20 6f 72 20 time a vfs or
0630: 66 69 6c 65 20 6d 65 74 68 6f 64 20 69 73 20 63 file method is c
0640: 61 6c 6c 65 64 20 62 79 20 53 51 4c 69 74 65 2e alled by SQLite.
0650: 20 42 65 66 6f 72 65 20 69 6e 76 6f 6b 69 6e 67 Before invoking
0660: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 63 61 .** the ca
0670: 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 2c 20 66 llback script, f
0680: 69 76 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72 ive arguments ar
0690: 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 69 74 e appended to it
06a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 :.**.**
06b0: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 * The name of th
06c0: 65 20 69 6e 76 6f 6b 65 64 20 6d 65 74 68 6f 64 e invoked method
06d0: 20 2d 20 69 2e 65 2e 20 22 78 52 65 61 64 22 2e - i.e. "xRead".
06e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 2a .**.** *
06f0: 20 54 68 65 20 74 69 6d 65 20 63 6f 6e 73 75 6d The time consum
0700: 65 64 20 62 79 20 74 68 65 20 6d 65 74 68 6f 64 ed by the method
0710: 20 63 61 6c 6c 20 61 73 20 6d 65 61 73 75 72 65 call as measure
0720: 64 20 62 79 20 68 77 74 69 6d 65 28 29 20 28 61 d by hwtime() (a
0730: 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 69 n.** i
0740: 6e 74 65 67 65 72 20 76 61 6c 75 65 29 0a 2a 2a nteger value).**
0750: 0a 2a 2a 20 20 20 20 20 20 20 20 20 2a 20 41 20 .** * A
0760: 73 74 72 69 6e 67 20 76 61 6c 75 65 20 77 69 74 string value wit
0770: 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 65 h a different me
0780: 61 6e 69 6e 67 20 66 6f 72 20 64 69 66 66 65 72 aning for differ
0790: 65 6e 74 20 63 61 6c 6c 73 2e 20 0a 2a 2a 20 20 ent calls. .**
07a0: 20 20 20 20 20 20 20 20 20 46 6f 72 20 66 69 6c For fil
07b0: 65 20 6d 65 74 68 6f 64 73 2c 20 74 68 65 20 6e e methods, the n
07c0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 ame of the file
07d0: 62 65 69 6e 67 20 6f 70 65 72 61 74 65 64 20 6f being operated o
07e0: 6e 2e 20 46 6f 72 0a 2a 2a 20 20 20 20 20 20 20 n. For.**
07f0: 20 20 20 20 6f 74 68 65 72 20 6d 65 74 68 6f 64 other method
0800: 73 20 69 74 20 69 73 20 74 68 65 20 66 69 6c 65 s it is the file
0810: 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 name argument, i
0820: 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 f any..**.**
0830: 20 20 20 20 20 2a 20 41 20 33 32 2d 62 69 74 20 * A 32-bit
0840: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 77 69 integer value wi
0850: 74 68 20 61 20 63 61 6c 6c 2d 73 70 65 63 69 66 th a call-specif
0860: 69 63 20 6d 65 61 6e 69 6e 67 2e 0a 2a 2a 0a 2a ic meaning..**.*
0870: 2a 20 20 20 20 20 20 20 20 20 2a 20 41 20 36 34 * * A 64
0880: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c -bit integer val
0890: 75 65 2e 20 46 6f 72 20 78 52 65 61 64 28 29 20 ue. For xRead()
08a0: 61 6e 64 20 78 57 72 69 74 65 28 29 20 63 61 6c and xWrite() cal
08b0: 6c 73 20 74 68 69 73 0a 2a 2a 20 20 20 20 20 20 ls this.**
08c0: 20 20 20 20 20 69 73 20 74 68 65 20 66 69 6c 65 is the file
08d0: 20 6f 66 66 73 65 74 20 62 65 69 6e 67 20 77 72 offset being wr
08e0: 69 74 74 65 6e 20 74 6f 20 6f 72 20 72 65 61 64 itten to or read
08f0: 20 66 72 6f 6d 2e 20 55 6e 75 73 65 64 20 62 79 from. Unused by
0900: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 6c .** al
0910: 6c 20 6f 74 68 65 72 20 63 61 6c 6c 73 2e 0a 2a l other calls..*
0920: 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 69 *.** sqlite3_i
0930: 6e 73 74 76 66 73 20 72 65 73 65 74 20 4e 41 4d nstvfs reset NAM
0940: 45 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 5a 65 E.**.** Ze
0950: 72 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 ro the internal
0960: 65 76 65 6e 74 20 63 6f 75 6e 74 65 72 73 20 61 event counters a
0970: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 76 ssociated with v
0980: 66 73 20 24 4e 41 4d 45 2c 20 0a 2a 2a 20 20 20 fs $NAME, .**
0990: 20 20 20 20 77 68 69 63 68 20 6d 75 73 74 20 68 which must h
09a0: 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 ave been created
09b0: 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 69 by an earlier i
09c0: 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a nvocation of .**
09d0: 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33 5f [sqlite3_
09e0: 69 6e 73 74 76 66 73 20 63 72 65 61 74 65 5d 2e instvfs create].
09f0: 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 .**.** sqlite3
0a00: 5f 69 6e 73 74 76 66 73 20 72 65 70 6f 72 74 20 _instvfs report
0a10: 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 NAME.**.**
0a20: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 Return the valu
0a30: 65 73 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e es of the intern
0a40: 61 6c 20 65 76 65 6e 74 20 63 6f 75 6e 74 65 72 al event counter
0a50: 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a s associated .**
0a60: 20 20 20 20 20 20 20 77 69 74 68 20 76 66 73 20 with vfs
0a70: 24 4e 41 4d 45 2e 20 54 68 65 20 72 65 70 6f 72 $NAME. The repor
0a80: 74 20 66 6f 72 6d 61 74 20 69 73 20 61 20 6c 69 t format is a li
0a90: 73 74 20 77 69 74 68 20 6f 6e 65 20 65 6c 65 6d st with one elem
0aa0: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 66 6f 72 ent.** for
0ab0: 20 65 61 63 68 20 6d 65 74 68 6f 64 20 63 61 6c each method cal
0ac0: 6c 20 28 78 57 72 69 74 65 2c 20 78 52 65 61 64 l (xWrite, xRead
0ad0: 20 65 74 63 2e 29 2e 20 45 61 63 68 20 65 6c 65 etc.). Each ele
0ae0: 6d 65 6e 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 ment is.**
0af0: 20 69 74 73 65 6c 66 20 61 20 6c 69 73 74 20 77 itself a list w
0b00: 69 74 68 20 74 68 72 65 65 20 65 6c 65 6d 65 6e ith three elemen
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 ts:.**.**
0b20: 20 20 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 * The name of
0b30: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 20 the method call
0b40: 2d 20 69 2e 65 2e 20 22 78 57 72 69 74 65 22 2c - i.e. "xWrite",
0b50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 2a 20 54 68 .** * Th
0b60: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f e total number o
0b70: 66 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 6d f calls to the m
0b80: 65 74 68 6f 64 20 28 61 6e 20 69 6e 74 65 67 65 ethod (an intege
0b90: 72 29 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 2a r)..** *
0ba0: 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20 74 The aggregate t
0bb0: 69 6d 65 20 63 6f 6e 73 75 6d 65 64 20 62 79 20 ime consumed by
0bc0: 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 all calls to the
0bd0: 20 6d 65 74 68 6f 64 20 61 73 0a 2a 2a 20 20 20 method as.**
0be0: 20 20 20 20 20 20 20 20 6d 65 61 73 75 72 65 64 measured
0bf0: 20 62 79 20 68 77 74 69 6d 65 28 29 20 28 61 6e by hwtime() (an
0c00: 20 69 6e 74 65 67 65 72 29 2e 0a 2a 2f 0a 0a 23 integer)..*/..#
0c10: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 include "sqlite3
0c20: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 .h".#include "sq
0c30: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a liteInt.h"../*.*
0c40: 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 * Maximum pathna
0c50: 6d 65 20 6c 65 6e 67 74 68 20 73 75 70 70 6f 72 me length suppor
0c60: 74 65 64 20 62 79 20 74 68 65 20 69 6e 73 74 20 ted by the inst
0c70: 62 61 63 6b 65 6e 64 2e 0a 2a 2f 0a 23 64 65 66 backend..*/.#def
0c80: 69 6e 65 20 49 4e 53 54 5f 4d 41 58 5f 50 41 54 ine INST_MAX_PAT
0c90: 48 4e 41 4d 45 20 35 31 32 0a 0a 0a 2f 2a 20 46 HNAME 512.../* F
0ca0: 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 2f ile methods */./
0cb0: 2a 20 56 66 73 20 6d 65 74 68 6f 64 73 20 2a 2f * Vfs methods */
0cc0: 0a 23 64 65 66 69 6e 65 20 4f 53 5f 41 43 43 45 .#define OS_ACCE
0cd0: 53 53 20 20 20 20 20 20 20 20 20 20 20 20 31 0a SS 1.
0ce0: 23 64 65 66 69 6e 65 20 4f 53 5f 43 48 45 43 4b #define OS_CHECK
0cf0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 20 32 0a 23 RESERVEDLOCK 2.#
0d00: 64 65 66 69 6e 65 20 4f 53 5f 43 4c 4f 53 45 20 define OS_CLOSE
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 33 0a 23 64 3.#d
0d20: 65 66 69 6e 65 20 4f 53 5f 43 55 52 52 45 4e 54 efine OS_CURRENT
0d30: 54 49 4d 45 20 20 20 20 20 20 20 34 0a 23 64 65 TIME 4.#de
0d40: 66 69 6e 65 20 4f 53 5f 44 45 4c 45 54 45 20 20 fine OS_DELETE
0d50: 20 20 20 20 20 20 20 20 20 20 35 0a 23 64 65 66 5.#def
0d60: 69 6e 65 20 4f 53 5f 44 45 56 43 48 41 52 20 20 ine OS_DEVCHAR
0d70: 20 20 20 20 20 20 20 20 20 36 0a 23 64 65 66 69 6.#defi
0d80: 6e 65 20 4f 53 5f 46 49 4c 45 43 4f 4e 54 52 4f ne OS_FILECONTRO
0d90: 4c 20 20 20 20 20 20 20 37 0a 23 64 65 66 69 6e L 7.#defin
0da0: 65 20 4f 53 5f 46 49 4c 45 53 49 5a 45 20 20 20 e OS_FILESIZE
0db0: 20 20 20 20 20 20 20 38 0a 23 64 65 66 69 6e 65 8.#define
0dc0: 20 4f 53 5f 46 55 4c 4c 50 41 54 48 4e 41 4d 45 OS_FULLPATHNAME
0dd0: 20 20 20 20 20 20 39 0a 23 64 65 66 69 6e 65 20 9.#define
0de0: 4f 53 5f 47 45 54 54 45 4d 50 4e 41 4d 45 20 20 OS_GETTEMPNAME
0df0: 20 20 20 20 20 31 30 0a 23 64 65 66 69 6e 65 20 10.#define
0e00: 4f 53 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 OS_LOCK
0e10: 20 20 20 20 20 31 31 0a 23 64 65 66 69 6e 65 20 11.#define
0e20: 4f 53 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20 OS_OPEN
0e30: 20 20 20 20 20 31 32 0a 23 64 65 66 69 6e 65 20 12.#define
0e40: 4f 53 5f 52 41 4e 44 4f 4d 4e 45 53 53 20 20 20 OS_RANDOMNESS
0e50: 20 20 20 20 20 31 33 0a 23 64 65 66 69 6e 65 20 13.#define
0e60: 4f 53 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 OS_READ
0e70: 20 20 20 20 20 31 34 20 0a 23 64 65 66 69 6e 65 14 .#define
0e80: 20 4f 53 5f 53 45 43 54 4f 52 53 49 5a 45 20 20 OS_SECTORSIZE
0e90: 20 20 20 20 20 20 31 35 0a 23 64 65 66 69 6e 65 15.#define
0ea0: 20 4f 53 5f 53 4c 45 45 50 20 20 20 20 20 20 20 OS_SLEEP
0eb0: 20 20 20 20 20 20 31 36 0a 23 64 65 66 69 6e 65 16.#define
0ec0: 20 4f 53 5f 53 59 4e 43 20 20 20 20 20 20 20 20 OS_SYNC
0ed0: 20 20 20 20 20 20 31 37 0a 23 64 65 66 69 6e 65 17.#define
0ee0: 20 4f 53 5f 54 52 55 4e 43 41 54 45 20 20 20 20 OS_TRUNCATE
0ef0: 20 20 20 20 20 20 31 38 0a 23 64 65 66 69 6e 65 18.#define
0f00: 20 4f 53 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 OS_UNLOCK
0f10: 20 20 20 20 20 20 31 39 0a 23 64 65 66 69 6e 65 19.#define
0f20: 20 4f 53 5f 57 52 49 54 45 20 20 20 20 20 20 20 OS_WRITE
0f30: 20 20 20 20 20 20 32 30 0a 0a 23 64 65 66 69 6e 20..#defin
0f40: 65 20 4f 53 5f 4e 55 4d 45 56 45 4e 54 53 20 20 e OS_NUMEVENTS
0f50: 20 20 20 20 20 20 20 32 31 0a 0a 73 74 72 75 63 21..struc
0f60: 74 20 49 6e 73 74 56 66 73 20 7b 0a 20 20 73 71 t InstVfs {. sq
0f70: 6c 69 74 65 33 5f 76 66 73 20 62 61 73 65 3b 0a lite3_vfs base;.
0f80: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 sqlite3_vfs *p
0f90: 56 66 73 3b 0a 20 20 0a 20 20 76 6f 69 64 20 2a Vfs;. . void *
0fa0: 70 43 6c 69 65 6e 74 3b 0a 20 20 76 6f 69 64 20 pClient;. void
0fb0: 28 2a 78 44 65 6c 29 28 76 6f 69 64 20 2a 29 3b (*xDel)(void *);
0fc0: 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 29 . void (*xCall)
0fd0: 28 76 6f 69 64 20 2a 2c 20 69 6e 74 2c 20 73 71 (void *, int, sq
0fe0: 6c 69 74 65 33 5f 69 6e 74 36 34 2c 20 63 6f 6e lite3_int64, con
0ff0: 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20 st char *, int,
1000: 69 6e 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 int, sqlite3_int
1010: 36 34 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 64);.. /* Count
1020: 65 72 73 20 2a 2f 0a 20 20 69 36 34 20 61 54 69 ers */. i64 aTi
1030: 6d 65 5b 4f 53 5f 4e 55 4d 45 56 45 4e 54 53 5d me[OS_NUMEVENTS]
1040: 3b 0a 20 20 69 6e 74 20 61 43 6f 75 6e 74 5b 4f ;. int aCount[O
1050: 53 5f 4e 55 4d 45 56 45 4e 54 53 5d 3b 0a 7d 3b S_NUMEVENTS];.};
1060: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 .typedef struct
1070: 49 6e 73 74 56 66 73 20 49 6e 73 74 56 66 73 3b InstVfs InstVfs;
1080: 0a 0a 23 64 65 66 69 6e 65 20 52 45 41 4c 56 46 ..#define REALVF
1090: 53 28 70 29 20 28 28 28 49 6e 73 74 56 66 73 20 S(p) (((InstVfs
10a0: 2a 29 28 70 29 29 2d 3e 70 56 66 73 29 0a 0a 74 *)(p))->pVfs)..t
10b0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 69 6e ypedef struct in
10c0: 73 74 5f 66 69 6c 65 20 69 6e 73 74 5f 66 69 6c st_file inst_fil
10d0: 65 3b 0a 73 74 72 75 63 74 20 69 6e 73 74 5f 66 e;.struct inst_f
10e0: 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f ile {. sqlite3_
10f0: 66 69 6c 65 20 62 61 73 65 3b 0a 20 20 73 71 6c file base;. sql
1100: 69 74 65 33 5f 66 69 6c 65 20 2a 70 52 65 61 6c ite3_file *pReal
1110: 3b 0a 20 20 49 6e 73 74 56 66 73 20 2a 70 49 6e ;. InstVfs *pIn
1120: 73 74 56 66 73 3b 0a 20 20 63 6f 6e 73 74 20 63 stVfs;. const c
1130: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e har *zName;. in
1140: 74 20 66 6c 61 67 73 3b 0a 7d 3b 0a 0a 2f 2a 0a t flags;.};../*.
1150: 2a 2a 20 4d 65 74 68 6f 64 20 64 65 63 6c 61 72 ** Method declar
1160: 61 74 69 6f 6e 73 20 66 6f 72 20 69 6e 73 74 5f ations for inst_
1170: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 file..*/.static
1180: 69 6e 74 20 69 6e 73 74 43 6c 6f 73 65 28 73 71 int instClose(sq
1190: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 lite3_file*);.st
11a0: 61 74 69 63 20 69 6e 74 20 69 6e 73 74 52 65 61 atic int instRea
11b0: 64 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c d(sqlite3_file*,
11c0: 20 76 6f 69 64 2a 2c 20 69 6e 74 20 69 41 6d 74 void*, int iAmt
11d0: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 , sqlite3_int64
11e0: 69 4f 66 73 74 29 3b 0a 73 74 61 74 69 63 20 69 iOfst);.static i
11f0: 6e 74 20 69 6e 73 74 57 72 69 74 65 28 73 71 6c nt instWrite(sql
1200: 69 74 65 33 5f 66 69 6c 65 2a 2c 63 6f 6e 73 74 ite3_file*,const
1210: 20 76 6f 69 64 2a 2c 69 6e 74 20 69 41 6d 74 2c void*,int iAmt,
1220: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 sqlite3_int64 i
1230: 4f 66 73 74 29 3b 0a 73 74 61 74 69 63 20 69 6e Ofst);.static in
1240: 74 20 69 6e 73 74 54 72 75 6e 63 61 74 65 28 73 t instTruncate(s
1250: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71 qlite3_file*, sq
1260: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 69 7a 65 lite3_int64 size
1270: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e );.static int in
1280: 73 74 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 stSync(sqlite3_f
1290: 69 6c 65 2a 2c 20 69 6e 74 20 66 6c 61 67 73 29 ile*, int flags)
12a0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 ;.static int ins
12b0: 74 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 tFileSize(sqlite
12c0: 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 3_file*, sqlite3
12d0: 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 3b 0a _int64 *pSize);.
12e0: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 4c static int instL
12f0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 ock(sqlite3_file
1300: 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 *, int);.static
1310: 69 6e 74 20 69 6e 73 74 55 6e 6c 6f 63 6b 28 73 int instUnlock(s
1320: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e qlite3_file*, in
1330: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 t);.static int i
1340: 6e 73 74 43 68 65 63 6b 52 65 73 65 72 76 65 64 nstCheckReserved
1350: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c Lock(sqlite3_fil
1360: 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 e*);.static int
1370: 69 6e 73 74 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 instFileControl(
1380: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 sqlite3_file*, i
1390: 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 nt op, void *pAr
13a0: 67 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 g);.static int i
13b0: 6e 73 74 53 65 63 74 6f 72 53 69 7a 65 28 73 71 nstSectorSize(sq
13c0: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 lite3_file*);.st
13d0: 61 74 69 63 20 69 6e 74 20 69 6e 73 74 44 65 76 atic int instDev
13e0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 iceCharacteristi
13f0: 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a cs(sqlite3_file*
1400: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65 74 68 6f 64 );../*.** Method
1410: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f declarations fo
1420: 72 20 69 6e 73 74 5f 76 66 73 2e 0a 2a 2f 0a 73 r inst_vfs..*/.s
1430: 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 4f 70 tatic int instOp
1440: 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c en(sqlite3_vfs*,
1450: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 73 const char *, s
1460: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e qlite3_file*, in
1470: 74 20 2c 20 69 6e 74 20 2a 29 3b 0a 73 74 61 74 t , int *);.stat
1480: 69 63 20 69 6e 74 20 69 6e 73 74 44 65 6c 65 74 ic int instDelet
1490: 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 e(sqlite3_vfs*,
14a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d const char *zNam
14b0: 65 2c 20 69 6e 74 20 73 79 6e 63 44 69 72 29 3b e, int syncDir);
14c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 .static int inst
14d0: 41 63 63 65 73 73 28 73 71 6c 69 74 65 33 5f 76 Access(sqlite3_v
14e0: 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 fs*, const char
14f0: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 66 6c 61 67 *zName, int flag
1500: 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 s);.static int i
1510: 6e 73 74 47 65 74 54 65 6d 70 4e 61 6d 65 28 73 nstGetTempName(s
1520: 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74 qlite3_vfs*, int
1530: 20 6e 4f 75 74 2c 20 63 68 61 72 20 2a 7a 4f 75 nOut, char *zOu
1540: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 t);.static int i
1550: 6e 73 74 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 nstFullPathname(
1560: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f sqlite3_vfs*, co
1570: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c nst char *zName,
1580: 20 69 6e 74 2c 20 63 68 61 72 20 2a 7a 4f 75 74 int, char *zOut
1590: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a );.static void *
15a0: 69 6e 73 74 44 6c 4f 70 65 6e 28 73 71 6c 69 74 instDlOpen(sqlit
15b0: 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 e3_vfs*, const c
15c0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 3b har *zFilename);
15d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 .static void ins
15e0: 74 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 tDlError(sqlite3
15f0: 5f 76 66 73 2a 2c 20 69 6e 74 20 6e 42 79 74 65 _vfs*, int nByte
1600: 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 29 , char *zErrMsg)
1610: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 69 ;.static void *i
1620: 6e 73 74 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 nstDlSym(sqlite3
1630: 5f 76 66 73 2a 2c 76 6f 69 64 2a 2c 20 63 6f 6e _vfs*,void*, con
1640: 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c st char *zSymbol
1650: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 );.static void i
1660: 6e 73 74 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 nstDlClose(sqlit
1670: 65 33 5f 76 66 73 2a 2c 20 76 6f 69 64 2a 29 3b e3_vfs*, void*);
1680: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 .static int inst
1690: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 Randomness(sqlit
16a0: 65 33 5f 76 66 73 2a 2c 20 69 6e 74 20 6e 42 79 e3_vfs*, int nBy
16b0: 74 65 2c 20 63 68 61 72 20 2a 7a 4f 75 74 29 3b te, char *zOut);
16c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 .static int inst
16d0: 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 Sleep(sqlite3_vf
16e0: 73 2a 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 s*, int microsec
16f0: 6f 6e 64 73 29 3b 0a 73 74 61 74 69 63 20 69 6e onds);.static in
1700: 74 20 69 6e 73 74 43 75 72 72 65 6e 74 54 69 6d t instCurrentTim
1710: 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 e(sqlite3_vfs*,
1720: 64 6f 75 62 6c 65 2a 29 3b 0a 0a 73 74 61 74 69 double*);..stati
1730: 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 69 6e c sqlite3_vfs in
1740: 73 74 5f 76 66 73 20 3d 20 7b 0a 20 20 31 2c 20 st_vfs = {. 1,
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1760: 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e /* iVersion
1770: 20 2a 2f 0a 20 20 73 69 7a 65 6f 66 28 69 6e 73 */. sizeof(ins
1780: 74 5f 66 69 6c 65 29 2c 20 20 20 20 20 20 2f 2a t_file), /*
1790: 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 49 szOsFile */. I
17a0: 4e 53 54 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45 NST_MAX_PATHNAME
17b0: 2c 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 , /* mxPath
17c0: 6e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 name */. 0,
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17e0: 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 /* pNext */.
17f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
1800: 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 /* zName
1810: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 */. 0,
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1830: 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 69 pAppData */. i
1840: 6e 73 74 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 nstOpen,
1850: 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 /* xOpen
1860: 2a 2f 0a 20 20 69 6e 73 74 44 65 6c 65 74 65 2c */. instDelete,
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1880: 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 73 xDelete */. ins
1890: 74 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 tAccess,
18a0: 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 /* xAccess
18b0: 2a 2f 0a 20 20 69 6e 73 74 47 65 74 54 65 6d 70 */. instGetTemp
18c0: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 Name, /*
18d0: 78 47 65 74 54 65 6d 70 4e 61 6d 65 20 2a 2f 0a xGetTempName */.
18e0: 20 20 69 6e 73 74 46 75 6c 6c 50 61 74 68 6e 61 instFullPathna
18f0: 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 78 46 75 me, /* xFu
1900: 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 llPathname */.
1910: 69 6e 73 74 44 6c 4f 70 65 6e 2c 20 20 20 20 20 instDlOpen,
1920: 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 /* xDlOp
1930: 65 6e 20 2a 2f 0a 20 20 69 6e 73 74 44 6c 45 72 en */. instDlEr
1940: 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 ror,
1950: 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 /* xDlError */.
1960: 20 69 6e 73 74 44 6c 53 79 6d 2c 20 20 20 20 20 instDlSym,
1970: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 /* xDlS
1980: 79 6d 20 2a 2f 0a 20 20 69 6e 73 74 44 6c 43 6c ym */. instDlCl
1990: 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 ose,
19a0: 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 /* xDlClose */.
19b0: 20 69 6e 73 74 52 61 6e 64 6f 6d 6e 65 73 73 2c instRandomness,
19c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e /* xRan
19d0: 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 73 domness */. ins
19e0: 74 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 tSleep,
19f0: 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a /* xSleep *
1a00: 2f 0a 20 20 69 6e 73 74 43 75 72 72 65 6e 74 54 /. instCurrentT
1a10: 69 6d 65 20 20 20 20 20 20 20 20 20 2f 2a 20 78 ime /* x
1a20: 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 7d CurrentTime */.}
1a30: 3b 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 ;..static sqlite
1a40: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 69 6e 73 3_io_methods ins
1a50: 74 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 3d 20 7b t_io_methods = {
1a60: 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 . 1,
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a80: 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a /* iVersion */.
1a90: 20 20 69 6e 73 74 43 6c 6f 73 65 2c 20 20 20 20 instClose,
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ab0: 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 /* xClose */.
1ac0: 20 69 6e 73 74 52 65 61 64 2c 20 20 20 20 20 20 instRead,
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ae0: 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 69 /* xRead */. i
1af0: 6e 73 74 57 72 69 74 65 2c 20 20 20 20 20 20 20 nstWrite,
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1b10: 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 69 6e * xWrite */. in
1b20: 73 74 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 stTruncate,
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1b40: 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 xTruncate */.
1b50: 69 6e 73 74 53 79 6e 63 2c 20 20 20 20 20 20 20 instSync,
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b70: 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 69 6e /* xSync */. in
1b80: 73 74 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 stFileSize,
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1ba0: 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 xFileSize */.
1bb0: 69 6e 73 74 4c 6f 63 6b 2c 20 20 20 20 20 20 20 instLock,
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1bd0: 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 69 6e /* xLock */. in
1be0: 73 74 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 stUnlock,
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1c00: 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e xUnlock */. in
1c10: 73 74 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c stCheckReservedL
1c20: 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 2f 2a ock, /*
1c30: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c xCheckReservedL
1c40: 6f 63 6b 20 2a 2f 0a 20 20 69 6e 73 74 46 69 6c ock */. instFil
1c50: 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 eControl,
1c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c /* xFil
1c70: 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 69 6e eControl */. in
1c80: 73 74 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 stSectorSize,
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1ca0: 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a xSectorSize */.
1cb0: 20 20 69 6e 73 74 44 65 76 69 63 65 43 68 61 72 instDeviceChar
1cc0: 61 63 74 65 72 69 73 74 69 63 73 20 20 20 20 20 acteristics
1cd0: 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 /* xDeviceChar
1ce0: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 7d acteristics */.}
1cf0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c ;../*.** The fol
1d00: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 6f lowing routine o
1d10: 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 70 65 6e nly works on pen
1d20: 74 69 75 6d 2d 63 6c 61 73 73 20 70 72 6f 63 65 tium-class proce
1d30: 73 73 6f 72 73 2e 0a 2a 2a 20 49 74 20 75 73 65 ssors..** It use
1d40: 73 20 74 68 65 20 52 44 54 53 43 20 6f 70 63 6f s the RDTSC opco
1d50: 64 65 20 74 6f 20 72 65 61 64 20 74 68 65 20 63 de to read the c
1d60: 79 63 6c 65 20 63 6f 75 6e 74 20 76 61 6c 75 65 ycle count value
1d70: 20 6f 75 74 20 6f 66 20 74 68 65 0a 2a 2a 20 70 out of the.** p
1d80: 72 6f 63 65 73 73 6f 72 20 61 6e 64 20 72 65 74 rocessor and ret
1d90: 75 72 6e 73 20 74 68 61 74 20 76 61 6c 75 65 2e urns that value.
1da0: 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 This can be us
1db0: 65 64 20 66 6f 72 20 68 69 67 68 2d 72 65 73 0a ed for high-res.
1dc0: 2a 2a 20 70 72 6f 66 69 6c 69 6e 67 2e 0a 2a 2f ** profiling..*/
1dd0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 69 33 38 .#if defined(i38
1de0: 36 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 6) || defined(__
1df0: 69 33 38 36 5f 5f 29 20 7c 7c 20 64 65 66 69 6e i386__) || defin
1e00: 65 64 28 5f 4d 5f 49 58 38 36 29 0a 5f 5f 69 6e ed(_M_IX86).__in
1e10: 6c 69 6e 65 5f 5f 20 75 6e 73 69 67 6e 65 64 20 line__ unsigned
1e20: 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74 20 68 77 long long int hw
1e30: 74 69 6d 65 28 76 6f 69 64 29 7b 0a 20 20 20 75 time(void){. u
1e40: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 6f 2c 20 nsigned int lo,
1e50: 68 69 3b 0a 20 20 20 2f 2a 20 57 65 20 63 61 6e hi;. /* We can
1e60: 6e 6f 74 20 75 73 65 20 22 3d 41 22 2c 20 73 69 not use "=A", si
1e70: 6e 63 65 20 74 68 69 73 20 77 6f 75 6c 64 20 75 nce this would u
1e80: 73 65 20 25 72 61 78 20 6f 6e 20 78 38 36 5f 36 se %rax on x86_6
1e90: 34 20 2a 2f 0a 20 20 20 5f 5f 61 73 6d 5f 5f 20 4 */. __asm__
1ea0: 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f 20 28 22 72 __volatile__ ("r
1eb0: 64 74 73 63 22 20 3a 20 22 3d 61 22 20 28 6c 6f dtsc" : "=a" (lo
1ec0: 29 2c 20 22 3d 64 22 20 28 68 69 29 29 3b 0a 20 ), "=d" (hi));.
1ed0: 20 20 72 65 74 75 72 6e 20 28 75 6e 73 69 67 6e return (unsign
1ee0: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74 ed long long int
1ef0: 29 68 69 20 3c 3c 20 33 32 20 7c 20 6c 6f 3b 0a )hi << 32 | lo;.
1f00: 7d 0a 23 65 6c 73 65 0a 20 20 73 74 61 74 69 63 }.#else. static
1f10: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c unsigned long l
1f20: 6f 6e 67 20 69 6e 74 20 68 77 74 69 6d 65 28 76 ong int hwtime(v
1f30: 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 oid){ return 0;
1f40: 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e }.#endif..#defin
1f50: 65 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 65 45 76 e OS_TIME_IO(eEv
1f60: 65 6e 74 2c 20 41 2c 20 42 2c 20 43 61 6c 6c 29 ent, A, B, Call)
1f70: 20 7b 20 20 20 20 20 5c 0a 20 20 69 6e 73 74 5f { \. inst_
1f80: 66 69 6c 65 20 2a 70 20 3d 20 28 69 6e 73 74 5f file *p = (inst_
1f90: 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 20 20 20 file *)pFile;
1fa0: 20 20 20 20 20 20 5c 0a 20 20 49 6e 73 74 56 66 \. InstVf
1fb0: 73 20 2a 70 49 6e 73 74 56 66 73 20 3d 20 70 2d s *pInstVfs = p-
1fc0: 3e 70 49 6e 73 74 56 66 73 3b 20 20 20 20 20 20 >pInstVfs;
1fd0: 20 20 20 20 20 5c 0a 20 20 69 6e 74 20 72 63 3b \. int rc;
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2000: 20 20 20 20 5c 0a 20 20 69 36 34 20 74 20 3d 20 \. i64 t =
2010: 68 77 74 69 6d 65 28 29 3b 20 20 20 20 20 20 20 hwtime();
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2030: 20 20 20 5c 0a 20 20 72 63 20 3d 20 43 61 6c 6c \. rc = Call
2040: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2060: 20 20 5c 0a 20 20 74 20 3d 20 68 77 74 69 6d 65 \. t = hwtime
2070: 28 29 20 2d 20 74 3b 20 20 20 20 20 20 20 20 20 () - t;
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2090: 20 5c 0a 20 20 70 49 6e 73 74 56 66 73 2d 3e 61 \. pInstVfs->a
20a0: 54 69 6d 65 5b 65 45 76 65 6e 74 5d 20 2b 3d 20 Time[eEvent] +=
20b0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 t;
20c0: 5c 0a 20 20 70 49 6e 73 74 56 66 73 2d 3e 61 43 \. pInstVfs->aC
20d0: 6f 75 6e 74 5b 65 45 76 65 6e 74 5d 20 2b 3d 20 ount[eEvent] +=
20e0: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 1; \
20f0: 0a 20 20 69 66 28 20 70 49 6e 73 74 56 66 73 2d . if( pInstVfs-
2100: 3e 78 43 61 6c 6c 20 29 7b 20 20 20 20 20 20 20 >xCall ){
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a \.
2120: 20 20 20 20 70 49 6e 73 74 56 66 73 2d 3e 78 43 pInstVfs->xC
2130: 61 6c 6c 28 70 49 6e 73 74 56 66 73 2d 3e 70 43 all(pInstVfs->pC
2140: 6c 69 65 6e 74 2c 20 65 45 76 65 6e 74 2c 20 74 lient, eEvent, t
2150: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 2d 3e 66 , p->zName, p->f
2160: 6c 61 67 73 2c 20 41 2c 20 42 29 3b 20 5c 0a 20 lags, A, B); \.
2170: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 }
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2190: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 \.
21a0: 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20 return rc;
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21c0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a \.}..
21d0: 23 64 65 66 69 6e 65 20 4f 53 5f 54 49 4d 45 5f #define OS_TIME_
21e0: 56 46 53 28 65 45 76 65 6e 74 2c 20 5a 2c 20 41 VFS(eEvent, Z, A
21f0: 2c 20 42 2c 20 43 61 6c 6c 29 20 7b 20 20 20 20 , B, Call) {
2200: 20 20 5c 0a 20 20 49 6e 73 74 56 66 73 20 2a 70 \. InstVfs *p
2210: 49 6e 73 74 56 66 73 20 3d 20 28 49 6e 73 74 56 InstVfs = (InstV
2220: 66 73 20 2a 29 70 56 66 73 3b 20 20 20 5c 0a 20 fs *)pVfs; \.
2230: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 int rc;
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2250: 20 20 20 20 20 20 20 20 5c 0a 20 20 69 36 34 20 \. i64
2260: 74 20 3d 20 68 77 74 69 6d 65 28 29 3b 20 20 20 t = hwtime();
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2280: 20 20 20 5c 0a 20 20 72 63 20 3d 20 43 61 6c 6c \. rc = Call
2290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a \.
22b0: 20 20 74 20 3d 20 68 77 74 69 6d 65 28 29 20 2d t = hwtime() -
22c0: 20 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 t;
22d0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 70 49 6e \. pIn
22e0: 73 74 56 66 73 2d 3e 61 54 69 6d 65 5b 65 45 76 stVfs->aTime[eEv
22f0: 65 6e 74 5d 20 2b 3d 20 74 3b 20 20 20 20 20 20 ent] += t;
2300: 20 20 20 20 5c 0a 20 20 70 49 6e 73 74 56 66 73 \. pInstVfs
2310: 2d 3e 61 43 6f 75 6e 74 5b 65 45 76 65 6e 74 5d ->aCount[eEvent]
2320: 20 2b 3d 20 31 3b 20 20 20 20 20 20 20 20 20 5c += 1; \
2330: 0a 20 20 69 66 28 20 70 49 6e 73 74 56 66 73 2d . if( pInstVfs-
2340: 3e 78 43 61 6c 6c 20 29 7b 20 20 20 20 20 20 20 >xCall ){
2350: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 \.
2360: 70 49 6e 73 74 56 66 73 2d 3e 78 43 61 6c 6c 28 pInstVfs->xCall(
2370: 70 49 6e 73 74 56 66 73 2d 3e 70 43 6c 69 65 6e pInstVfs->pClien
2380: 74 2c 20 65 45 76 65 6e 74 2c 20 74 2c 20 5a 2c t, eEvent, t, Z,
2390: 20 30 2c 20 41 2c 20 42 29 3b 20 5c 0a 20 20 7d 0, A, B); \. }
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23c0: 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e \. return
23d0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 rc;
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23f0: 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 \.}../*.** Clos
2400: 65 20 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e 0a e an inst-file..
2410: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e */.static int in
2420: 73 74 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f stClose(sqlite3_
2430: 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 file *pFile){.
2440: 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f 43 4c OS_TIME_IO(OS_CL
2450: 4f 53 45 2c 20 30 2c 20 30 2c 20 73 71 6c 69 74 OSE, 0, 0, sqlit
2460: 65 33 4f 73 43 6c 6f 73 65 28 70 2d 3e 70 52 65 e3OsClose(p->pRe
2470: 61 6c 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 al));.}../*.** R
2480: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e ead data from an
2490: 20 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 inst-file..*/.s
24a0: 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 52 65 tatic int instRe
24b0: 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 ad(. sqlite3_fi
24c0: 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 76 6f le *pFile, . vo
24d0: 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74 id *zBuf, . int
24e0: 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65 iAmt, . sqlite
24f0: 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a _int64 iOfst.){.
2500: 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f OS_TIME_IO(OS_
2510: 52 45 41 44 2c 20 69 41 6d 74 2c 20 69 4f 66 73 READ, iAmt, iOfs
2520: 74 2c 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 t, sqlite3OsRead
2530: 28 70 2d 3e 70 52 65 61 6c 2c 20 7a 42 75 66 2c (p->pReal, zBuf,
2540: 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 29 3b 0a iAmt, iOfst));.
2550: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 }../*.** Write d
2560: 61 74 61 20 74 6f 20 61 6e 20 69 6e 73 74 2d 66 ata to an inst-f
2570: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 ile..*/.static i
2580: 6e 74 20 69 6e 73 74 57 72 69 74 65 28 0a 20 20 nt instWrite(.
2590: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 sqlite3_file *pF
25a0: 69 6c 65 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 ile,. const voi
25b0: 64 20 2a 7a 2c 0a 20 20 69 6e 74 20 69 41 6d 74 d *z,. int iAmt
25c0: 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 ,. sqlite_int64
25d0: 20 69 4f 66 73 74 0a 29 7b 0a 20 20 4f 53 5f 54 iOfst.){. OS_T
25e0: 49 4d 45 5f 49 4f 28 4f 53 5f 57 52 49 54 45 2c IME_IO(OS_WRITE,
25f0: 20 69 41 6d 74 2c 20 69 4f 66 73 74 2c 20 73 71 iAmt, iOfst, sq
2600: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 2d 3e lite3OsWrite(p->
2610: 70 52 65 61 6c 2c 20 7a 2c 20 69 41 6d 74 2c 20 pReal, z, iAmt,
2620: 69 4f 66 73 74 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a iOfst));.}../*.*
2630: 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 69 6e * Truncate an in
2640: 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 st-file..*/.stat
2650: 69 63 20 69 6e 74 20 69 6e 73 74 54 72 75 6e 63 ic int instTrunc
2660: 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 ate(sqlite3_file
2670: 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f *pFile, sqlite_
2680: 69 6e 74 36 34 20 73 69 7a 65 29 7b 0a 20 20 4f int64 size){. O
2690: 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f 54 52 55 S_TIME_IO(OS_TRU
26a0: 4e 43 41 54 45 2c 20 30 2c 20 73 69 7a 65 2c 20 NCATE, 0, size,
26b0: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 sqlite3OsTruncat
26c0: 65 28 70 2d 3e 70 52 65 61 6c 2c 20 73 69 7a 65 e(p->pReal, size
26d0: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e ));.}../*.** Syn
26e0: 63 20 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e 0a c an inst-file..
26f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e */.static int in
2700: 73 74 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 stSync(sqlite3_f
2710: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 ile *pFile, int
2720: 66 6c 61 67 73 29 7b 0a 20 20 4f 53 5f 54 49 4d flags){. OS_TIM
2730: 45 5f 49 4f 28 4f 53 5f 53 59 4e 43 2c 20 66 6c E_IO(OS_SYNC, fl
2740: 61 67 73 2c 20 30 2c 20 73 71 6c 69 74 65 33 4f ags, 0, sqlite3O
2750: 73 53 79 6e 63 28 70 2d 3e 70 52 65 61 6c 2c 20 sSync(p->pReal,
2760: 66 6c 61 67 73 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a flags));.}../*.*
2770: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 * Return the cur
2780: 72 65 6e 74 20 66 69 6c 65 2d 73 69 7a 65 20 6f rent file-size o
2790: 66 20 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e 0a f an inst-file..
27a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e */.static int in
27b0: 73 74 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 stFileSize(sqlit
27c0: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 e3_file *pFile,
27d0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 53 sqlite_int64 *pS
27e0: 69 7a 65 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f ize){. OS_TIME_
27f0: 49 4f 28 4f 53 5f 46 49 4c 45 53 49 5a 45 2c 20 IO(OS_FILESIZE,
2800: 30 2c 20 30 2c 20 73 71 6c 69 74 65 33 4f 73 46 0, 0, sqlite3OsF
2810: 69 6c 65 53 69 7a 65 28 70 2d 3e 70 52 65 61 6c ileSize(p->pReal
2820: 2c 20 70 53 69 7a 65 29 29 3b 0a 7d 0a 0a 2f 2a , pSize));.}../*
2830: 0a 2a 2a 20 4c 6f 63 6b 20 61 6e 20 69 6e 73 74 .** Lock an inst
2840: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 -file..*/.static
2850: 20 69 6e 74 20 69 6e 73 74 4c 6f 63 6b 28 73 71 int instLock(sq
2860: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c lite3_file *pFil
2870: 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 e, int eLock){.
2880: 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f 4c OS_TIME_IO(OS_L
2890: 4f 43 4b 2c 20 65 4c 6f 63 6b 2c 20 30 2c 20 73 OCK, eLock, 0, s
28a0: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 2d 3e qlite3OsLock(p->
28b0: 70 52 65 61 6c 2c 20 65 4c 6f 63 6b 29 29 3b 0a pReal, eLock));.
28c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 }../*.** Unlock
28d0: 61 6e 20 69 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f an inst-file..*/
28e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 74 .static int inst
28f0: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 Unlock(sqlite3_f
2900: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 ile *pFile, int
2910: 65 4c 6f 63 6b 29 7b 0a 20 20 4f 53 5f 54 49 4d eLock){. OS_TIM
2920: 45 5f 49 4f 28 4f 53 5f 55 4e 4c 4f 43 4b 2c 20 E_IO(OS_UNLOCK,
2930: 65 4c 6f 63 6b 2c 20 30 2c 20 73 71 6c 69 74 65 eLock, 0, sqlite
2940: 33 4f 73 55 6e 6c 6f 63 6b 28 70 2d 3e 70 52 65 3OsUnlock(p->pRe
2950: 61 6c 2c 20 65 4c 6f 63 6b 29 29 3b 0a 7d 0a 0a al, eLock));.}..
2960: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 61 /*.** Check if a
2970: 6e 6f 74 68 65 72 20 66 69 6c 65 2d 68 61 6e 64 nother file-hand
2980: 6c 65 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 le holds a RESER
2990: 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 61 6e 20 69 VED lock on an i
29a0: 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 nst-file..*/.sta
29b0: 74 69 63 20 69 6e 74 20 69 6e 73 74 43 68 65 63 tic int instChec
29c0: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 kReservedLock(sq
29d0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c lite3_file *pFil
29e0: 65 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f e){. OS_TIME_IO
29f0: 28 4f 53 5f 43 48 45 43 4b 52 45 53 45 52 56 45 (OS_CHECKRESERVE
2a00: 44 4c 4f 43 4b 2c 20 30 2c 20 30 2c 20 73 71 6c DLOCK, 0, 0, sql
2a10: 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 ite3OsCheckReser
2a20: 76 65 64 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c vedLock(p->pReal
2a30: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c ));.}../*.** Fil
2a40: 65 20 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 e control method
2a50: 2e 20 46 6f 72 20 63 75 73 74 6f 6d 20 6f 70 65 . For custom ope
2a60: 72 61 74 69 6f 6e 73 20 6f 6e 20 61 6e 20 69 6e rations on an in
2a70: 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 st-file..*/.stat
2a80: 69 63 20 69 6e 74 20 69 6e 73 74 46 69 6c 65 43 ic int instFileC
2a90: 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 ontrol(sqlite3_f
2aa0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 ile *pFile, int
2ab0: 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b op, void *pArg){
2ac0: 0a 20 20 4f 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 . OS_TIME_IO(OS
2ad0: 5f 46 49 4c 45 43 4f 4e 54 52 4f 4c 2c 20 30 2c _FILECONTROL, 0,
2ae0: 20 30 2c 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 0, sqlite3OsFil
2af0: 65 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61 eControl(p->pRea
2b00: 6c 2c 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a 7d l, op, pArg));.}
2b10: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 ../*.** Return t
2b20: 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 he sector-size i
2b30: 6e 20 62 79 74 65 73 20 66 6f 72 20 61 6e 20 69 n bytes for an i
2b40: 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 nst-file..*/.sta
2b50: 74 69 63 20 69 6e 74 20 69 6e 73 74 53 65 63 74 tic int instSect
2b60: 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 orSize(sqlite3_f
2b70: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 4f ile *pFile){. O
2b80: 53 5f 54 49 4d 45 5f 49 4f 28 4f 53 5f 53 45 43 S_TIME_IO(OS_SEC
2b90: 54 4f 52 53 49 5a 45 2c 20 30 2c 20 30 2c 20 73 TORSIZE, 0, 0, s
2ba0: 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 qlite3OsSectorSi
2bb0: 7a 65 28 70 2d 3e 70 52 65 61 6c 29 29 3b 0a 7d ze(p->pReal));.}
2bc0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 ../*.** Return t
2bd0: 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63 he device charac
2be0: 74 65 72 69 73 74 69 63 20 66 6c 61 67 73 20 73 teristic flags s
2bf0: 75 70 70 6f 72 74 65 64 20 62 79 20 61 6e 20 69 upported by an i
2c00: 6e 73 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 nst-file..*/.sta
2c10: 74 69 63 20 69 6e 74 20 69 6e 73 74 44 65 76 69 tic int instDevi
2c20: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 ceCharacteristic
2c30: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a s(sqlite3_file *
2c40: 70 46 69 6c 65 29 7b 0a 20 20 4f 53 5f 54 49 4d pFile){. OS_TIM
2c50: 45 5f 49 4f 28 4f 53 5f 44 45 56 43 48 41 52 2c E_IO(OS_DEVCHAR,
2c60: 20 30 2c 20 30 2c 20 73 71 6c 69 74 65 33 4f 73 0, 0, sqlite3Os
2c70: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 DeviceCharacteri
2c80: 73 74 69 63 73 28 70 2d 3e 70 52 65 61 6c 29 29 stics(p->pReal))
2c90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 ;.}../*.** Open
2ca0: 61 6e 20 69 6e 73 74 20 66 69 6c 65 20 68 61 6e an inst file han
2cb0: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 dle..*/.static i
2cc0: 6e 74 20 69 6e 73 74 4f 70 65 6e 28 0a 20 20 73 nt instOpen(. s
2cd0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 qlite3_vfs *pVfs
2ce0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a ,. const char *
2cf0: 7a 4e 61 6d 65 2c 0a 20 20 73 71 6c 69 74 65 33 zName,. sqlite3
2d00: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20 _file *pFile,.
2d10: 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 69 6e 74 int flags,. int
2d20: 20 2a 70 4f 75 74 46 6c 61 67 73 0a 29 7b 0a 20 *pOutFlags.){.
2d30: 20 69 6e 73 74 5f 66 69 6c 65 20 2a 70 20 3d 20 inst_file *p =
2d40: 28 69 6e 73 74 5f 66 69 6c 65 20 2a 29 70 46 69 (inst_file *)pFi
2d50: 6c 65 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 le;. pFile->pMe
2d60: 74 68 6f 64 73 20 3d 20 26 69 6e 73 74 5f 69 6f thods = &inst_io
2d70: 5f 6d 65 74 68 6f 64 73 3b 0a 20 20 70 2d 3e 70 _methods;. p->p
2d80: 52 65 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f Real = (sqlite3_
2d90: 66 69 6c 65 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 file *)&p[1];.
2da0: 70 2d 3e 70 49 6e 73 74 56 66 73 20 3d 20 28 49 p->pInstVfs = (I
2db0: 6e 73 74 56 66 73 20 2a 29 70 56 66 73 3b 0a 20 nstVfs *)pVfs;.
2dc0: 20 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d p->zName = zNam
2dd0: 65 3b 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 e;. p->flags =
2de0: 66 6c 61 67 73 3b 0a 0a 20 20 4f 53 5f 54 49 4d flags;.. OS_TIM
2df0: 45 5f 56 46 53 28 4f 53 5f 4f 50 45 4e 2c 20 7a E_VFS(OS_OPEN, z
2e00: 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 30 2c 0a Name, flags, 0,.
2e10: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 sqlite3OsOpe
2e20: 6e 28 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c n(REALVFS(pVfs),
2e30: 20 7a 4e 61 6d 65 2c 20 70 2d 3e 70 52 65 61 6c zName, p->pReal
2e40: 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 , flags, pOutFla
2e50: 67 73 29 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a gs). );.}../*.*
2e60: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c * Delete the fil
2e70: 65 20 6c 6f 63 61 74 65 64 20 61 74 20 7a 50 61 e located at zPa
2e80: 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 th. If the dirSy
2e90: 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 nc argument is t
2ea0: 72 75 65 2c 0a 2a 2a 20 65 6e 73 75 72 65 20 74 rue,.** ensure t
2eb0: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6d he file-system m
2ec0: 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 61 72 65 odifications are
2ed0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 synced to disk
2ee0: 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e before.** return
2ef0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 ing..*/.static i
2f00: 6e 74 20 69 6e 73 74 44 65 6c 65 74 65 28 73 71 nt instDelete(sq
2f10: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c lite3_vfs *pVfs,
2f20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 const char *zPa
2f30: 74 68 2c 20 69 6e 74 20 64 69 72 53 79 6e 63 29 th, int dirSync)
2f40: 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 56 46 53 28 {. OS_TIME_VFS(
2f50: 4f 53 5f 44 45 4c 45 54 45 2c 20 7a 50 61 74 68 OS_DELETE, zPath
2f60: 2c 20 64 69 72 53 79 6e 63 2c 20 30 2c 0a 20 20 , dirSync, 0,.
2f70: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 sqlite3OsDelet
2f80: 65 28 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c e(REALVFS(pVfs),
2f90: 20 7a 50 61 74 68 2c 20 64 69 72 53 79 6e 63 29 zPath, dirSync)
2fa0: 20 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 . );.}../*.**
2fb0: 54 65 73 74 20 66 6f 72 20 61 63 63 65 73 73 20 Test for access
2fc0: 70 65 72 6d 69 73 73 69 6f 6e 73 2e 20 52 65 74 permissions. Ret
2fd0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 urn true if the
2fe0: 72 65 71 75 65 73 74 65 64 20 70 65 72 6d 69 73 requested permis
2ff0: 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 76 61 69 6c sion.** is avail
3000: 61 62 6c 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f able, or false o
3010: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 therwise..*/.sta
3020: 74 69 63 20 69 6e 74 20 69 6e 73 74 41 63 63 65 tic int instAcce
3030: 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a ss(sqlite3_vfs *
3040: 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 pVfs, const char
3050: 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 *zPath, int fla
3060: 67 73 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 56 gs){. OS_TIME_V
3070: 46 53 28 4f 53 5f 41 43 43 45 53 53 2c 20 7a 50 FS(OS_ACCESS, zP
3080: 61 74 68 2c 20 66 6c 61 67 73 2c 20 30 2c 20 0a ath, flags, 0, .
3090: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 41 63 63 sqlite3OsAcc
30a0: 65 73 73 28 52 45 41 4c 56 46 53 28 70 56 66 73 ess(REALVFS(pVfs
30b0: 29 2c 20 7a 50 61 74 68 2c 20 66 6c 61 67 73 29 ), zPath, flags)
30c0: 20 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 . );.}../*.**
30d0: 50 6f 70 75 6c 61 74 65 20 62 75 66 66 65 72 20 Populate buffer
30e0: 7a 42 75 66 4f 75 74 20 77 69 74 68 20 61 20 70 zBufOut with a p
30f0: 61 74 68 6e 61 6d 65 20 73 75 69 74 61 62 6c 65 athname suitable
3100: 20 66 6f 72 20 75 73 65 20 61 73 20 61 20 0a 2a for use as a .*
3110: 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 * temporary file
3120: 2e 20 7a 42 75 66 4f 75 74 20 69 73 20 67 75 61 . zBufOut is gua
3130: 72 61 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e 74 ranteed to point
3140: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 to a buffer of
3150: 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20 28 49 4e .** at least (IN
3160: 53 54 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b ST_MAX_PATHNAME+
3170: 31 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 1) bytes..*/.sta
3180: 74 69 63 20 69 6e 74 20 69 6e 73 74 47 65 74 54 tic int instGetT
3190: 65 6d 70 4e 61 6d 65 28 73 71 6c 69 74 65 33 5f empName(sqlite3_
31a0: 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e vfs *pVfs, int n
31b0: 4f 75 74 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f Out, char *zBufO
31c0: 75 74 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 56 ut){. OS_TIME_V
31d0: 46 53 28 20 4f 53 5f 47 45 54 54 45 4d 50 4e 41 FS( OS_GETTEMPNA
31e0: 4d 45 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 ME, 0, 0, 0,.
31f0: 20 73 71 6c 69 74 65 33 4f 73 47 65 74 54 65 6d sqlite3OsGetTem
3200: 70 6e 61 6d 65 28 52 45 41 4c 56 46 53 28 70 56 pname(REALVFS(pV
3210: 66 73 29 2c 20 6e 4f 75 74 2c 20 7a 42 75 66 4f fs), nOut, zBufO
3220: 75 74 29 3b 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a ut);. );.}../*.
3230: 2a 2a 20 50 6f 70 75 6c 61 74 65 20 62 75 66 66 ** Populate buff
3240: 65 72 20 7a 4f 75 74 20 77 69 74 68 20 74 68 65 er zOut with the
3250: 20 66 75 6c 6c 20 63 61 6e 6f 6e 69 63 61 6c 20 full canonical
3260: 70 61 74 68 6e 61 6d 65 20 63 6f 72 72 65 73 70 pathname corresp
3270: 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 onding.** to the
3280: 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 7a 50 61 pathname in zPa
3290: 74 68 2e 20 7a 4f 75 74 20 69 73 20 67 75 61 72 th. zOut is guar
32a0: 61 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 anteed to point
32b0: 74 6f 20 61 20 62 75 66 66 65 72 0a 2a 2a 20 6f to a buffer.** o
32c0: 66 20 61 74 20 6c 65 61 73 74 20 28 49 4e 53 54 f at least (INST
32d0: 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 29 _MAX_PATHNAME+1)
32e0: 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 bytes..*/.stati
32f0: 63 20 69 6e 74 20 69 6e 73 74 46 75 6c 6c 50 61 c int instFullPa
3300: 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 thname(. sqlite
3310: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 3_vfs *pVfs, .
3320: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 const char *zPat
3330: 68 2c 20 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 h, . int nOut,
3340: 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 0a 29 7b . char *zOut.){
3350: 0a 20 20 4f 53 5f 54 49 4d 45 5f 56 46 53 28 20 . OS_TIME_VFS(
3360: 4f 53 5f 46 55 4c 4c 50 41 54 48 4e 41 4d 45 2c OS_FULLPATHNAME,
3370: 20 7a 50 61 74 68 2c 20 30 2c 20 30 2c 0a 20 20 zPath, 0, 0,.
3380: 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 sqlite3OsFullP
3390: 61 74 68 6e 61 6d 65 28 52 45 41 4c 56 46 53 28 athname(REALVFS(
33a0: 70 56 66 73 29 2c 20 7a 50 61 74 68 2c 20 6e 4f pVfs), zPath, nO
33b0: 75 74 2c 20 7a 4f 75 74 29 3b 0a 20 20 29 3b 0a ut, zOut);. );.
33c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 }../*.** Open th
33d0: 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 e dynamic librar
33e0: 79 20 6c 6f 63 61 74 65 64 20 61 74 20 7a 50 61 y located at zPa
33f0: 74 68 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 th and return a
3400: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 handle..*/.stati
3410: 63 20 76 6f 69 64 20 2a 69 6e 73 74 44 6c 4f 70 c void *instDlOp
3420: 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a en(sqlite3_vfs *
3430: 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 pVfs, const char
3440: 20 2a 7a 50 61 74 68 29 7b 0a 20 20 72 65 74 75 *zPath){. retu
3450: 72 6e 20 73 71 6c 69 74 65 33 4f 73 44 6c 4f 70 rn sqlite3OsDlOp
3460: 65 6e 28 52 45 41 4c 56 46 53 28 70 56 66 73 29 en(REALVFS(pVfs)
3470: 2c 20 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a , zPath);.}../*.
3480: 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 ** Populate the
3490: 62 75 66 66 65 72 20 7a 45 72 72 4d 73 67 20 28 buffer zErrMsg (
34a0: 73 69 7a 65 20 6e 42 79 74 65 20 62 79 74 65 73 size nByte bytes
34b0: 29 20 77 69 74 68 20 61 20 68 75 6d 61 6e 20 72 ) with a human r
34c0: 65 61 64 61 62 6c 65 0a 2a 2a 20 75 74 66 2d 38 eadable.** utf-8
34d0: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 string describi
34e0: 6e 67 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 ng the most rece
34f0: 6e 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 nt error encount
3500: 65 72 65 64 20 61 73 73 6f 63 69 61 74 65 64 20 ered associated
3510: 0a 2a 2a 20 77 69 74 68 20 64 79 6e 61 6d 69 63 .** with dynamic
3520: 20 6c 69 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 73 libraries..*/.s
3530: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 74 44 tatic void instD
3540: 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 lError(sqlite3_v
3550: 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 fs *pVfs, int nB
3560: 79 74 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d yte, char *zErrM
3570: 73 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 4f 73 sg){. sqlite3Os
3580: 44 6c 45 72 72 6f 72 28 52 45 41 4c 56 46 53 28 DlError(REALVFS(
3590: 70 56 66 73 29 2c 20 6e 42 79 74 65 2c 20 7a 45 pVfs), nByte, zE
35a0: 72 72 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a rrMsg);.}../*.**
35b0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 Return a pointe
35c0: 72 20 74 6f 20 74 68 65 20 73 79 6d 62 6f 6c 20 r to the symbol
35d0: 7a 53 79 6d 62 6f 6c 20 69 6e 20 74 68 65 20 64 zSymbol in the d
35e0: 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20 70 ynamic library p
35f0: 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 Handle..*/.stati
3600: 63 20 76 6f 69 64 20 2a 69 6e 73 74 44 6c 53 79 c void *instDlSy
3610: 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 m(sqlite3_vfs *p
3620: 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 Vfs, void *pHand
3630: 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a le, const char *
3640: 7a 53 79 6d 62 6f 6c 29 7b 0a 20 20 72 65 74 75 zSymbol){. retu
3650: 72 6e 20 73 71 6c 69 74 65 33 4f 73 44 6c 53 79 rn sqlite3OsDlSy
3660: 6d 28 52 45 41 4c 56 46 53 28 70 56 66 73 29 2c m(REALVFS(pVfs),
3670: 20 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f pHandle, zSymbo
3680: 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f l);.}../*.** Clo
3690: 73 65 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c se the dynamic l
36a0: 69 62 72 61 72 79 20 68 61 6e 64 6c 65 20 70 48 ibrary handle pH
36b0: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 andle..*/.static
36c0: 20 76 6f 69 64 20 69 6e 73 74 44 6c 43 6c 6f 73 void instDlClos
36d0: 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 e(sqlite3_vfs *p
36e0: 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 Vfs, void *pHand
36f0: 6c 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 4f 73 le){. sqlite3Os
3700: 44 6c 43 6c 6f 73 65 28 52 45 41 4c 56 46 53 28 DlClose(REALVFS(
3710: 70 56 66 73 29 2c 20 70 48 61 6e 64 6c 65 29 3b pVfs), pHandle);
3720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 .}../*.** Popula
3730: 74 65 20 74 68 65 20 62 75 66 66 65 72 20 70 6f te the buffer po
3740: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 42 75 66 inted to by zBuf
3750: 4f 75 74 20 77 69 74 68 20 6e 42 79 74 65 20 62 Out with nByte b
3760: 79 74 65 73 20 6f 66 20 0a 2a 2a 20 72 61 6e 64 ytes of .** rand
3770: 6f 6d 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 om data..*/.stat
3780: 69 63 20 69 6e 74 20 69 6e 73 74 52 61 6e 64 6f ic int instRando
3790: 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 mness(sqlite3_vf
37a0: 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79 s *pVfs, int nBy
37b0: 74 65 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 te, char *zBufOu
37c0: 74 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 56 46 t){. OS_TIME_VF
37d0: 53 28 20 4f 53 5f 52 41 4e 44 4f 4d 4e 45 53 53 S( OS_RANDOMNESS
37e0: 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 2c 0a 20 , 0, nByte, 0,.
37f0: 20 20 20 73 71 6c 69 74 65 33 4f 73 52 61 6e 64 sqlite3OsRand
3800: 6f 6d 6e 65 73 73 28 52 45 41 4c 56 46 53 28 70 omness(REALVFS(p
3810: 56 66 73 29 2c 20 6e 42 79 74 65 2c 20 7a 42 75 Vfs), nByte, zBu
3820: 66 4f 75 74 29 3b 0a 20 20 29 3b 0a 7d 0a 0a 2f fOut);. );.}../
3830: 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 6e *.** Sleep for n
3840: 4d 69 63 72 6f 20 6d 69 63 72 6f 73 65 63 6f 6e Micro microsecon
3850: 64 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e ds. Return the n
3860: 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 umber of microse
3870: 63 6f 6e 64 73 20 0a 2a 2a 20 61 63 74 75 61 6c conds .** actual
3880: 6c 79 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 ly slept..*/.sta
3890: 74 69 63 20 69 6e 74 20 69 6e 73 74 53 6c 65 65 tic int instSlee
38a0: 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 p(sqlite3_vfs *p
38b0: 56 66 73 2c 20 69 6e 74 20 6e 4d 69 63 72 6f 29 Vfs, int nMicro)
38c0: 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 56 46 53 28 {. OS_TIME_VFS(
38d0: 20 4f 53 5f 53 4c 45 45 50 2c 20 30 2c 20 6e 4d OS_SLEEP, 0, nM
38e0: 69 63 72 6f 2c 20 30 2c 20 0a 20 20 20 20 73 71 icro, 0, . sq
38f0: 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 52 45 41 lite3OsSleep(REA
3900: 4c 56 46 53 28 70 56 66 73 29 2c 20 6e 4d 69 63 LVFS(pVfs), nMic
3910: 72 6f 29 20 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a ro) . );.}../*.
3920: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 ** Return the cu
3930: 72 72 65 6e 74 20 74 69 6d 65 20 61 73 20 61 20 rrent time as a
3940: 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 Julian Day numbe
3950: 72 20 69 6e 20 2a 70 54 69 6d 65 4f 75 74 2e 0a r in *pTimeOut..
3960: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e */.static int in
3970: 73 74 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 stCurrentTime(sq
3980: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c lite3_vfs *pVfs,
3990: 20 64 6f 75 62 6c 65 20 2a 70 54 69 6d 65 4f 75 double *pTimeOu
39a0: 74 29 7b 0a 20 20 4f 53 5f 54 49 4d 45 5f 56 46 t){. OS_TIME_VF
39b0: 53 28 20 4f 53 5f 43 55 52 52 45 4e 54 54 49 4d S( OS_CURRENTTIM
39c0: 45 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 E, 0, 0, 0,.
39d0: 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 sqlite3OsCurrent
39e0: 54 69 6d 65 28 52 45 41 4c 56 46 53 28 70 56 66 Time(REALVFS(pVf
39f0: 73 29 2c 20 70 54 69 6d 65 4f 75 74 29 20 0a 20 s), pTimeOut) .
3a00: 20 29 3b 0a 7d 0a 0a 73 71 6c 69 74 65 33 5f 76 );.}..sqlite3_v
3a10: 66 73 20 2a 73 71 6c 69 74 65 33 5f 69 6e 73 74 fs *sqlite3_inst
3a20: 76 66 73 5f 63 72 65 61 74 65 28 63 6f 6e 73 74 vfs_create(const
3a30: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f char *zName, co
3a40: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e nst char *zParen
3a50: 74 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b t){. int nByte;
3a60: 0a 20 20 49 6e 73 74 56 66 73 20 2a 70 3b 0a 20 . InstVfs *p;.
3a70: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 50 sqlite3_vfs *pP
3a80: 61 72 65 6e 74 3b 0a 0a 20 20 70 50 61 72 65 6e arent;.. pParen
3a90: 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f t = sqlite3_vfs_
3aa0: 66 69 6e 64 28 7a 50 61 72 65 6e 74 29 3b 0a 20 find(zParent);.
3ab0: 20 69 66 28 20 21 70 50 61 72 65 6e 74 20 29 7b if( !pParent ){
3ac0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 . return 0;.
3ad0: 20 7d 0a 0a 20 20 6e 42 79 74 65 20 3d 20 73 74 }.. nByte = st
3ae0: 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 rlen(zName) + 1
3af0: 2b 20 73 69 7a 65 6f 66 28 49 6e 73 74 56 66 73 + sizeof(InstVfs
3b00: 29 3b 0a 20 20 70 20 3d 20 28 49 6e 73 74 56 66 );. p = (InstVf
3b10: 73 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c s *)sqlite3_mall
3b20: 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 oc(nByte);. if(
3b30: 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a p ){. char *
3b40: 7a 43 6f 70 79 20 3d 20 28 63 68 61 72 20 2a 29 zCopy = (char *)
3b50: 26 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 &p[1];. memse
3b60: 74 28 70 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a t(p, 0, nByte);.
3b70: 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 26 69 memcpy(p, &i
3b80: 6e 73 74 5f 76 66 73 2c 20 73 69 7a 65 6f 66 28 nst_vfs, sizeof(
3b90: 73 71 6c 69 74 65 33 5f 76 66 73 29 29 3b 0a 20 sqlite3_vfs));.
3ba0: 20 20 20 70 2d 3e 70 56 66 73 20 3d 20 70 50 61 p->pVfs = pPa
3bb0: 72 65 6e 74 3b 0a 20 20 20 20 6d 65 6d 63 70 79 rent;. memcpy
3bc0: 28 7a 43 6f 70 79 2c 20 7a 4e 61 6d 65 2c 20 73 (zCopy, zName, s
3bd0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 trlen(zName));.
3be0: 20 20 20 70 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65 p->base.zName
3bf0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a = (const char *
3c00: 29 7a 43 6f 70 79 3b 0a 20 20 20 20 70 2d 3e 62 )zCopy;. p->b
3c10: 61 73 65 2e 73 7a 4f 73 46 69 6c 65 20 2b 3d 20 ase.szOsFile +=
3c20: 70 50 61 72 65 6e 74 2d 3e 73 7a 4f 73 46 69 6c pParent->szOsFil
3c30: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 e;. sqlite3_v
3c40: 66 73 5f 72 65 67 69 73 74 65 72 28 28 73 71 6c fs_register((sql
3c50: 69 74 65 33 5f 76 66 73 20 2a 29 70 2c 20 30 29 ite3_vfs *)p, 0)
3c60: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 ;. }.. return
3c70: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 29 70 (sqlite3_vfs *)p
3c80: 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 ;.}..void sqlite
3c90: 33 5f 69 6e 73 74 76 66 73 5f 63 6f 6e 66 69 67 3_instvfs_config
3ca0: 75 72 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 ure(. sqlite3_v
3cb0: 66 73 20 2a 70 56 66 73 2c 0a 20 20 76 6f 69 64 fs *pVfs,. void
3cc0: 20 28 2a 78 43 61 6c 6c 29 28 76 6f 69 64 2a 2c (*xCall)(void*,
3cd0: 20 69 6e 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e int, sqlite3_in
3ce0: 74 36 34 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a t64, const char*
3cf0: 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 36 34 29 , int, int, i64)
3d00: 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e ,. void *pClien
3d10: 74 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c t,. void (*xDel
3d20: 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 49 )(void *).){. I
3d30: 6e 73 74 56 66 73 20 2a 70 20 3d 20 28 49 6e 73 nstVfs *p = (Ins
3d40: 74 56 66 73 20 2a 29 70 56 66 73 3b 0a 20 20 61 tVfs *)pVfs;. a
3d50: 73 73 65 72 74 28 20 70 56 66 73 2d 3e 78 4f 70 ssert( pVfs->xOp
3d60: 65 6e 3d 3d 69 6e 73 74 4f 70 65 6e 20 29 3b 0a en==instOpen );.
3d70: 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b if( p->xDel ){
3d80: 0a 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e . p->xDel(p->
3d90: 70 43 6c 69 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 pClient);. }.
3da0: 70 2d 3e 78 43 61 6c 6c 20 3d 20 78 43 61 6c 6c p->xCall = xCall
3db0: 3b 0a 20 20 70 2d 3e 78 44 65 6c 20 3d 20 78 44 ;. p->xDel = xD
3dc0: 65 6c 3b 0a 20 20 70 2d 3e 70 43 6c 69 65 6e 74 el;. p->pClient
3dd0: 20 3d 20 70 43 6c 69 65 6e 74 3b 0a 7d 0a 0a 76 = pClient;.}..v
3de0: 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 oid sqlite3_inst
3df0: 76 66 73 5f 64 65 73 74 72 6f 79 28 73 71 6c 69 vfs_destroy(sqli
3e00: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 29 7b 0a te3_vfs *pVfs){.
3e10: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e sqlite3_vfs_un
3e20: 72 65 67 69 73 74 65 72 28 70 56 66 73 29 3b 0a register(pVfs);.
3e30: 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 sqlite3_instvf
3e40: 73 5f 63 6f 6e 66 69 67 75 72 65 28 70 56 66 73 s_configure(pVfs
3e50: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 , 0, 0, 0);. sq
3e60: 6c 69 74 65 33 5f 66 72 65 65 28 70 56 66 73 29 lite3_free(pVfs)
3e70: 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 ;.}..void sqlite
3e80: 33 5f 69 6e 73 74 76 66 73 5f 72 65 73 65 74 28 3_instvfs_reset(
3e90: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 sqlite3_vfs *pVf
3ea0: 73 29 7b 0a 20 20 49 6e 73 74 56 66 73 20 2a 70 s){. InstVfs *p
3eb0: 20 3d 20 28 49 6e 73 74 56 66 73 20 2a 29 70 56 = (InstVfs *)pV
3ec0: 66 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 fs;. assert( pV
3ed0: 66 73 2d 3e 78 4f 70 65 6e 3d 3d 69 6e 73 74 4f fs->xOpen==instO
3ee0: 70 65 6e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 pen );. memset(
3ef0: 70 2d 3e 61 54 69 6d 65 2c 20 30 2c 20 73 69 7a p->aTime, 0, siz
3f00: 65 6f 66 28 69 36 34 29 2a 4f 53 5f 4e 55 4d 45 eof(i64)*OS_NUME
3f10: 56 45 4e 54 53 29 3b 0a 20 20 6d 65 6d 73 65 74 VENTS);. memset
3f20: 28 70 2d 3e 61 43 6f 75 6e 74 2c 20 30 2c 20 73 (p->aCount, 0, s
3f30: 69 7a 65 6f 66 28 69 6e 74 29 2a 4f 53 5f 4e 55 izeof(int)*OS_NU
3f40: 4d 45 56 45 4e 54 53 29 3b 0a 7d 0a 0a 63 6f 6e MEVENTS);.}..con
3f50: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 st char *sqlite3
3f60: 5f 69 6e 73 74 76 66 73 5f 6e 61 6d 65 28 69 6e _instvfs_name(in
3f70: 74 20 65 45 76 65 6e 74 29 7b 0a 20 20 63 6f 6e t eEvent){. con
3f80: 73 74 20 63 68 61 72 20 2a 7a 45 76 65 6e 74 20 st char *zEvent
3f90: 3d 20 30 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 = 0;.. switch(
3fa0: 65 45 76 65 6e 74 20 29 7b 0a 20 20 20 20 63 61 eEvent ){. ca
3fb0: 73 65 20 4f 53 5f 43 4c 4f 53 45 3a 20 20 20 20 se OS_CLOSE:
3fc0: 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 zEvent
3fd0: 3d 20 22 78 43 6c 6f 73 65 22 3b 20 62 72 65 61 = "xClose"; brea
3fe0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 52 k;. case OS_R
3ff0: 45 41 44 3a 20 20 20 20 20 20 20 20 20 20 20 20 EAD:
4000: 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 52 65 61 zEvent = "xRea
4010: 64 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 d"; break;. c
4020: 61 73 65 20 4f 53 5f 57 52 49 54 45 3a 20 20 20 ase OS_WRITE:
4030: 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 zEvent
4040: 20 3d 20 22 78 57 72 69 74 65 22 3b 20 62 72 65 = "xWrite"; bre
4050: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f ak;. case OS_
4060: 54 52 55 4e 43 41 54 45 3a 20 20 20 20 20 20 20 TRUNCATE:
4070: 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 54 72 zEvent = "xTr
4080: 75 6e 63 61 74 65 22 3b 20 62 72 65 61 6b 3b 0a uncate"; break;.
4090: 20 20 20 20 63 61 73 65 20 4f 53 5f 53 59 4e 43 case OS_SYNC
40a0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a : z
40b0: 45 76 65 6e 74 20 3d 20 22 78 53 79 6e 63 22 3b Event = "xSync";
40c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 break;. case
40d0: 20 4f 53 5f 46 49 4c 45 53 49 5a 45 3a 20 20 20 OS_FILESIZE:
40e0: 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 zEvent =
40f0: 22 78 46 69 6c 65 73 69 7a 65 22 3b 20 62 72 65 "xFilesize"; bre
4100: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f ak;. case OS_
4110: 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 20 20 20 LOCK:
4120: 20 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 4c 6f zEvent = "xLo
4130: 63 6b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 ck"; break;.
4140: 63 61 73 65 20 4f 53 5f 55 4e 4c 4f 43 4b 3a 20 case OS_UNLOCK:
4150: 20 20 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e zEven
4160: 74 20 3d 20 22 78 55 6e 6c 6f 63 6b 22 3b 20 62 t = "xUnlock"; b
4170: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f reak;. case O
4180: 53 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c S_CHECKRESERVEDL
4190: 4f 43 4b 3a 20 7a 45 76 65 6e 74 20 3d 20 22 78 OCK: zEvent = "x
41a0: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 CheckReservedLoc
41b0: 6b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 k"; break;. c
41c0: 61 73 65 20 4f 53 5f 46 49 4c 45 43 4f 4e 54 52 ase OS_FILECONTR
41d0: 4f 4c 3a 20 20 20 20 20 20 20 7a 45 76 65 6e 74 OL: zEvent
41e0: 20 3d 20 22 78 46 69 6c 65 43 6f 6e 74 72 6f 6c = "xFileControl
41f0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 "; break;. ca
4200: 73 65 20 4f 53 5f 53 45 43 54 4f 52 53 49 5a 45 se OS_SECTORSIZE
4210: 3a 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 : zEvent
4220: 3d 20 22 78 53 65 63 74 6f 72 53 69 7a 65 22 3b = "xSectorSize";
4230: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 break;. case
4240: 20 4f 53 5f 44 45 56 43 48 41 52 3a 20 20 20 20 OS_DEVCHAR:
4250: 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d 20 zEvent =
4260: 22 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 "xDeviceCharacte
4270: 72 69 73 74 69 63 73 22 3b 20 62 72 65 61 6b 3b ristics"; break;
4280: 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 4f 50 45 . case OS_OPE
4290: 4e 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 N:
42a0: 7a 45 76 65 6e 74 20 3d 20 22 78 4f 70 65 6e 22 zEvent = "xOpen"
42b0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 ; break;. cas
42c0: 65 20 4f 53 5f 44 45 4c 45 54 45 3a 20 20 20 20 e OS_DELETE:
42d0: 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 3d zEvent =
42e0: 20 22 78 44 65 6c 65 74 65 22 3b 20 62 72 65 61 "xDelete"; brea
42f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 41 k;. case OS_A
4300: 43 43 45 53 53 3a 20 20 20 20 20 20 20 20 20 20 CCESS:
4310: 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 41 63 63 zEvent = "xAcc
4320: 65 73 73 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 ess"; break;.
4330: 20 63 61 73 65 20 4f 53 5f 47 45 54 54 45 4d 50 case OS_GETTEMP
4340: 4e 41 4d 45 3a 20 20 20 20 20 20 20 7a 45 76 65 NAME: zEve
4350: 6e 74 20 3d 20 22 78 47 65 74 54 65 6d 70 4e 61 nt = "xGetTempNa
4360: 6d 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 me"; break;.
4370: 63 61 73 65 20 4f 53 5f 46 55 4c 4c 50 41 54 48 case OS_FULLPATH
4380: 4e 41 4d 45 3a 20 20 20 20 20 20 7a 45 76 65 6e NAME: zEven
4390: 74 20 3d 20 22 78 46 75 6c 6c 50 61 74 68 6e 61 t = "xFullPathna
43a0: 6d 65 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 me"; break;.
43b0: 63 61 73 65 20 4f 53 5f 52 41 4e 44 4f 4d 4e 45 case OS_RANDOMNE
43c0: 53 53 3a 20 20 20 20 20 20 20 20 7a 45 76 65 6e SS: zEven
43d0: 74 20 3d 20 22 78 52 61 6e 64 6f 6d 6e 65 73 73 t = "xRandomness
43e0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 "; break;. ca
43f0: 73 65 20 4f 53 5f 53 4c 45 45 50 3a 20 20 20 20 se OS_SLEEP:
4400: 20 20 20 20 20 20 20 20 20 7a 45 76 65 6e 74 20 zEvent
4410: 3d 20 22 78 53 6c 65 65 70 22 3b 20 62 72 65 61 = "xSleep"; brea
4420: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 53 5f 43 k;. case OS_C
4430: 55 52 52 45 4e 54 54 49 4d 45 3a 20 20 20 20 20 URRENTTIME:
4440: 20 20 7a 45 76 65 6e 74 20 3d 20 22 78 43 75 72 zEvent = "xCur
4450: 72 65 6e 74 54 69 6d 65 22 3b 20 62 72 65 61 6b rentTime"; break
4460: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 ;. }.. return
4470: 7a 45 76 65 6e 74 3b 0a 7d 0a 0a 76 6f 69 64 20 zEvent;.}..void
4480: 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f sqlite3_instvfs_
4490: 67 65 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 get(. sqlite3_v
44a0: 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 69 6e 74 fs *pVfs, . int
44b0: 20 65 45 76 65 6e 74 2c 20 0a 20 20 63 6f 6e 73 eEvent, . cons
44c0: 74 20 63 68 61 72 20 2a 2a 70 7a 45 76 65 6e 74 t char **pzEvent
44d0: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 , . sqlite3_int
44e0: 36 34 20 2a 70 6e 43 6c 69 63 6b 2c 20 0a 20 20 64 *pnClick, .
44f0: 69 6e 74 20 2a 70 6e 43 61 6c 6c 0a 29 7b 0a 20 int *pnCall.){.
4500: 20 49 6e 73 74 56 66 73 20 2a 70 20 3d 20 28 49 InstVfs *p = (I
4510: 6e 73 74 56 66 73 20 2a 29 70 56 66 73 3b 0a 20 nstVfs *)pVfs;.
4520: 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 78 assert( pVfs->x
4530: 4f 70 65 6e 3d 3d 69 6e 73 74 4f 70 65 6e 20 29 Open==instOpen )
4540: 3b 0a 20 20 69 66 28 20 65 45 76 65 6e 74 3c 31 ;. if( eEvent<1
4550: 20 7c 7c 20 65 45 76 65 6e 74 3e 3d 4f 53 5f 4e || eEvent>=OS_N
4560: 55 4d 45 56 45 4e 54 53 20 29 7b 0a 20 20 20 20 UMEVENTS ){.
4570: 2a 70 7a 45 76 65 6e 74 20 3d 20 30 3b 0a 20 20 *pzEvent = 0;.
4580: 20 20 2a 70 6e 43 6c 69 63 6b 20 3d 20 30 3b 0a *pnClick = 0;.
4590: 20 20 20 20 2a 70 6e 43 61 6c 6c 20 3d 20 30 3b *pnCall = 0;
45a0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d . return;. }
45b0: 0a 0a 20 20 2a 70 7a 45 76 65 6e 74 20 3d 20 73 .. *pzEvent = s
45c0: 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 6e qlite3_instvfs_n
45d0: 61 6d 65 28 65 45 76 65 6e 74 29 3b 0a 20 20 2a ame(eEvent);. *
45e0: 70 6e 43 6c 69 63 6b 20 3d 20 70 2d 3e 61 54 69 pnClick = p->aTi
45f0: 6d 65 5b 65 45 76 65 6e 74 5d 3b 0a 20 20 2a 70 me[eEvent];. *p
4600: 6e 43 61 6c 6c 20 3d 20 70 2d 3e 61 43 6f 75 6e nCall = p->aCoun
4610: 74 5b 65 45 76 65 6e 74 5d 3b 0a 7d 0a 0a 23 64 t[eEvent];.}..#d
4620: 65 66 69 6e 65 20 42 49 4e 41 52 59 4c 4f 47 5f efine BINARYLOG_
4630: 42 55 46 46 45 52 53 49 5a 45 20 31 30 32 34 0a BUFFERSIZE 1024.
4640: 0a 73 74 72 75 63 74 20 49 6e 73 74 56 66 73 42 .struct InstVfsB
4650: 69 6e 61 72 79 4c 6f 67 20 7b 0a 20 20 69 6e 74 inaryLog {. int
4660: 20 6e 42 75 66 3b 0a 20 20 63 68 61 72 20 2a 7a nBuf;. char *z
4670: 42 75 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 Buf;. sqlite3_i
4680: 6e 74 36 34 20 69 4f 66 66 73 65 74 3b 0a 20 20 nt64 iOffset;.
4690: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4f sqlite3_file *pO
46a0: 75 74 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 ut;.};.typedef s
46b0: 74 72 75 63 74 20 49 6e 73 74 56 66 73 42 69 6e truct InstVfsBin
46c0: 61 72 79 4c 6f 67 20 49 6e 73 74 56 66 73 42 69 aryLog InstVfsBi
46d0: 6e 61 72 79 4c 6f 67 3b 0a 0a 73 74 61 74 69 63 naryLog;..static
46e0: 20 76 6f 69 64 20 70 75 74 33 32 62 69 74 73 28 void put32bits(
46f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 unsigned char *p
4700: 2c 20 75 33 32 20 76 29 7b 0a 20 20 70 5b 30 5d , u32 v){. p[0]
4710: 20 3d 20 76 3e 3e 32 34 3b 0a 20 20 70 5b 31 5d = v>>24;. p[1]
4720: 20 3d 20 76 3e 3e 31 36 3b 0a 20 20 70 5b 32 5d = v>>16;. p[2]
4730: 20 3d 20 76 3e 3e 38 3b 0a 20 20 70 5b 33 5d 20 = v>>8;. p[3]
4740: 3d 20 76 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 = v;.}..static v
4750: 6f 69 64 20 62 69 6e 61 72 79 6c 6f 67 5f 78 63 oid binarylog_xc
4760: 61 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 70 2c 0a all(. void *p,.
4770: 20 20 69 6e 74 20 65 45 76 65 6e 74 2c 0a 20 20 int eEvent,.
4780: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 43 sqlite3_int64 nC
4790: 6c 69 63 6b 2c 0a 20 20 63 6f 6e 73 74 20 63 68 lick,. const ch
47a0: 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 ar *zName,. int
47b0: 20 66 6c 61 67 73 2c 0a 20 20 69 6e 74 20 6e 42 flags,. int nB
47c0: 79 74 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 yte,. sqlite3_i
47d0: 6e 74 36 34 20 69 4f 66 66 73 65 74 0a 29 7b 0a nt64 iOffset.){.
47e0: 20 20 49 6e 73 74 56 66 73 42 69 6e 61 72 79 4c InstVfsBinaryL
47f0: 6f 67 20 2a 70 4c 6f 67 20 3d 20 28 49 6e 73 74 og *pLog = (Inst
4800: 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 2a 29 70 VfsBinaryLog *)p
4810: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 ;. unsigned cha
4820: 72 20 2a 7a 52 65 63 3b 0a 20 20 69 66 28 20 28 r *zRec;. if( (
4830: 32 30 2b 70 4c 6f 67 2d 3e 6e 42 75 66 29 3e 42 20+pLog->nBuf)>B
4840: 49 4e 41 52 59 4c 4f 47 5f 42 55 46 46 45 52 53 INARYLOG_BUFFERS
4850: 49 5a 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 IZE ){. sqlit
4860: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20 3d e3_file *pFile =
4870: 20 70 4c 6f 67 2d 3e 70 4f 75 74 3b 0a 20 20 20 pLog->pOut;.
4880: 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 pFile->pMethods
4890: 2d 3e 78 57 72 69 74 65 28 70 46 69 6c 65 2c 20 ->xWrite(pFile,
48a0: 70 4c 6f 67 2d 3e 7a 42 75 66 2c 20 70 4c 6f 67 pLog->zBuf, pLog
48b0: 2d 3e 6e 42 75 66 2c 20 70 4c 6f 67 2d 3e 69 4f ->nBuf, pLog->iO
48c0: 66 66 73 65 74 29 3b 0a 20 20 20 20 70 4c 6f 67 ffset);. pLog
48d0: 2d 3e 69 4f 66 66 73 65 74 20 2b 3d 20 70 4c 6f ->iOffset += pLo
48e0: 67 2d 3e 6e 42 75 66 3b 0a 20 20 20 20 70 4c 6f g->nBuf;. pLo
48f0: 67 2d 3e 6e 42 75 66 20 3d 20 30 3b 0a 20 20 7d g->nBuf = 0;. }
4900: 0a 20 20 7a 52 65 63 20 3d 20 28 75 6e 73 69 67 . zRec = (unsig
4910: 6e 65 64 20 63 68 61 72 20 2a 29 26 70 4c 6f 67 ned char *)&pLog
4920: 2d 3e 7a 42 75 66 5b 70 4c 6f 67 2d 3e 6e 42 75 ->zBuf[pLog->nBu
4930: 66 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 f];. put32bits(
4940: 26 7a 52 65 63 5b 30 5d 2c 20 65 45 76 65 6e 74 &zRec[0], eEvent
4950: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 );. put32bits(&
4960: 7a 52 65 63 5b 34 5d 2c 20 28 69 6e 74 29 6e 43 zRec[4], (int)nC
4970: 6c 69 63 6b 29 3b 0a 20 20 70 75 74 33 32 62 69 lick);. put32bi
4980: 74 73 28 26 7a 52 65 63 5b 38 5d 2c 20 66 6c 61 ts(&zRec[8], fla
4990: 67 73 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 gs);. put32bits
49a0: 28 26 7a 52 65 63 5b 31 32 5d 2c 20 6e 42 79 74 (&zRec[12], nByt
49b0: 65 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 e);. put32bits(
49c0: 26 7a 52 65 63 5b 31 36 5d 2c 20 28 69 6e 74 29 &zRec[16], (int)
49d0: 69 4f 66 66 73 65 74 29 3b 0a 20 20 70 4c 6f 67 iOffset);. pLog
49e0: 2d 3e 6e 42 75 66 20 2b 3d 20 32 30 3b 0a 7d 0a ->nBuf += 20;.}.
49f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 69 6e .static void bin
4a00: 61 72 79 6c 6f 67 5f 78 64 65 6c 28 76 6f 69 64 arylog_xdel(void
4a10: 20 2a 70 29 7b 0a 20 20 2f 2a 20 43 6c 6f 73 65 *p){. /* Close
4a20: 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 61 6e the log file an
4a30: 64 20 66 72 65 65 20 74 68 65 20 6d 65 6d 6f 72 d free the memor
4a40: 79 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 y allocated for
4a50: 74 68 65 20 0a 20 20 2a 2a 20 49 6e 73 74 56 66 the . ** InstVf
4a60: 73 42 69 6e 61 72 79 4c 6f 67 20 73 74 72 75 63 sBinaryLog struc
4a70: 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 49 6e 73 ture.. */. Ins
4a80: 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 20 2a 70 tVfsBinaryLog *p
4a90: 4c 6f 67 20 3d 20 28 49 6e 73 74 56 66 73 42 69 Log = (InstVfsBi
4aa0: 6e 61 72 79 4c 6f 67 20 2a 29 70 3b 0a 20 20 73 naryLog *)p;. s
4ab0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 qlite3_file *pFi
4ac0: 6c 65 20 3d 20 70 4c 6f 67 2d 3e 70 4f 75 74 3b le = pLog->pOut;
4ad0: 0a 20 20 69 66 28 20 70 4c 6f 67 2d 3e 6e 42 75 . if( pLog->nBu
4ae0: 66 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e f ){. pFile->
4af0: 70 4d 65 74 68 6f 64 73 2d 3e 78 57 72 69 74 65 pMethods->xWrite
4b00: 28 70 46 69 6c 65 2c 20 70 4c 6f 67 2d 3e 7a 42 (pFile, pLog->zB
4b10: 75 66 2c 20 70 4c 6f 67 2d 3e 6e 42 75 66 2c 20 uf, pLog->nBuf,
4b20: 70 4c 6f 67 2d 3e 69 4f 66 66 73 65 74 29 3b 0a pLog->iOffset);.
4b30: 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 }. pFile->pMe
4b40: 74 68 6f 64 73 2d 3e 78 43 6c 6f 73 65 28 70 46 thods->xClose(pF
4b50: 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f ile);. sqlite3_
4b60: 66 72 65 65 28 70 4c 6f 67 2d 3e 7a 42 75 66 29 free(pLog->zBuf)
4b70: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 ;. sqlite3_free
4b80: 28 70 4c 6f 67 29 3b 0a 7d 0a 0a 73 71 6c 69 74 (pLog);.}..sqlit
4b90: 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 5f e3_vfs *sqlite3_
4ba0: 69 6e 73 74 76 66 73 5f 62 69 6e 61 72 79 6c 6f instvfs_binarylo
4bb0: 67 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 g(. const char
4bc0: 2a 7a 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63 *zVfs,. const c
4bd0: 68 61 72 20 2a 7a 50 61 72 65 6e 74 56 66 73 2c har *zParentVfs,
4be0: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a . const char *
4bf0: 7a 4c 6f 67 0a 29 7b 0a 20 20 49 6e 73 74 56 66 zLog.){. InstVf
4c00: 73 42 69 6e 61 72 79 4c 6f 67 20 2a 70 3b 0a 20 sBinaryLog *p;.
4c10: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 sqlite3_vfs *pV
4c20: 66 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 fs;. sqlite3_vf
4c30: 73 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 69 6e s *pParent;. in
4c40: 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 66 t nByte;. int f
4c50: 6c 61 67 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a lags;. int rc;.
4c60: 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 73 71 6c . pParent = sql
4c70: 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 50 ite3_vfs_find(zP
4c80: 61 72 65 6e 74 56 66 73 29 3b 0a 20 20 69 66 28 arentVfs);. if(
4c90: 20 21 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 !pParent ){.
4ca0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a return 0;. }..
4cb0: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 nByte = sizeof
4cc0: 28 49 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f (InstVfsBinaryLo
4cd0: 67 29 20 2b 20 70 50 61 72 65 6e 74 2d 3e 73 7a g) + pParent->sz
4ce0: 4f 73 46 69 6c 65 3b 0a 0a 20 20 70 20 3d 20 28 OsFile;.. p = (
4cf0: 49 6e 73 74 56 66 73 42 69 6e 61 72 79 4c 6f 67 InstVfsBinaryLog
4d00: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f *)sqlite3_mallo
4d10: 63 28 6e 42 79 74 65 29 3b 0a 20 20 6d 65 6d 73 c(nByte);. mems
4d20: 65 74 28 70 2c 20 30 2c 20 6e 42 79 74 65 29 3b et(p, 0, nByte);
4d30: 0a 20 20 70 2d 3e 7a 42 75 66 20 3d 20 73 71 6c . p->zBuf = sql
4d40: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 42 49 4e 41 ite3_malloc(BINA
4d50: 52 59 4c 4f 47 5f 42 55 46 46 45 52 53 49 5a 45 RYLOG_BUFFERSIZE
4d60: 29 3b 0a 20 20 70 2d 3e 70 4f 75 74 20 3d 20 28 );. p->pOut = (
4d70: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 sqlite3_file *)&
4d80: 70 5b 31 5d 3b 0a 0a 20 20 66 6c 61 67 73 20 3d p[1];.. flags =
4d90: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 SQLITE_OPEN_REA
4da0: 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 DWRITE|SQLITE_OP
4db0: 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45 EN_CREATE|SQLITE
4dc0: 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 _OPEN_MASTER_JOU
4dd0: 52 4e 41 4c 3b 0a 20 20 72 63 20 3d 20 70 50 61 RNAL;. rc = pPa
4de0: 72 65 6e 74 2d 3e 78 4f 70 65 6e 28 70 50 61 72 rent->xOpen(pPar
4df0: 65 6e 74 2c 20 7a 4c 6f 67 2c 20 70 2d 3e 70 4f ent, zLog, p->pO
4e00: 75 74 2c 20 66 6c 61 67 73 2c 20 26 66 6c 61 67 ut, flags, &flag
4e10: 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 s);. if( rc==SQ
4e20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 LITE_OK ){. r
4e30: 63 20 3d 20 70 2d 3e 70 4f 75 74 2d 3e 70 4d 65 c = p->pOut->pMe
4e40: 74 68 6f 64 73 2d 3e 78 57 72 69 74 65 28 70 2d thods->xWrite(p-
4e50: 3e 70 4f 75 74 2c 20 22 73 71 6c 69 74 65 5f 6f >pOut, "sqlite_o
4e60: 73 74 72 61 63 65 31 2e 2e 2e 2e 2e 22 2c 20 32 strace1.....", 2
4e70: 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 69 4f 0, 0);. p->iO
4e80: 66 66 73 65 74 20 3d 20 32 30 3b 0a 20 20 7d 0a ffset = 20;. }.
4e90: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 if( rc ){.
4ea0: 62 69 6e 61 72 79 6c 6f 67 5f 78 64 65 6c 28 70 binarylog_xdel(p
4eb0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b );. return 0;
4ec0: 0a 20 20 7d 0a 0a 20 20 70 56 66 73 20 3d 20 73 . }.. pVfs = s
4ed0: 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 63 qlite3_instvfs_c
4ee0: 72 65 61 74 65 28 7a 56 66 73 2c 20 7a 50 61 72 reate(zVfs, zPar
4ef0: 65 6e 74 56 66 73 29 3b 0a 20 20 69 66 28 20 70 entVfs);. if( p
4f00: 56 66 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 Vfs ){. sqlit
4f10: 65 33 5f 69 6e 73 74 76 66 73 5f 63 6f 6e 66 69 e3_instvfs_confi
4f20: 67 75 72 65 28 70 56 66 73 2c 20 62 69 6e 61 72 gure(pVfs, binar
4f30: 79 6c 6f 67 5f 78 63 61 6c 6c 2c 20 70 2c 20 62 ylog_xcall, p, b
4f40: 69 6e 61 72 79 6c 6f 67 5f 78 64 65 6c 29 3b 0a inarylog_xdel);.
4f50: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 56 }.. return pV
4f60: 66 73 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a fs;.}../********
4f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
4f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
4f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
4fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
4fb0: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a **.*************
4fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
4fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
4fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
4ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a **************.*
5000: 2a 20 54 63 6c 20 69 6e 74 65 72 66 61 63 65 20 * Tcl interface
5010: 73 74 61 72 74 73 20 68 65 72 65 2e 0a 2a 2f 0a starts here..*/.
5020: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a #if SQLITE_TEST.
5030: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68 .#include <tcl.h
5040: 3e 0a 0a 73 74 72 75 63 74 20 49 6e 73 74 56 66 >..struct InstVf
5050: 73 43 61 6c 6c 20 7b 0a 20 20 54 63 6c 5f 49 6e sCall {. Tcl_In
5060: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 terp *interp;.
5070: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 Tcl_Obj *pScript
5080: 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72 ;.};.typedef str
5090: 75 63 74 20 49 6e 73 74 56 66 73 43 61 6c 6c 20 uct InstVfsCall
50a0: 49 6e 73 74 56 66 73 43 61 6c 6c 3b 0a 0a 73 74 InstVfsCall;..st
50b0: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 69 atic void test_i
50c0: 6e 73 74 76 66 73 5f 78 63 61 6c 6c 28 0a 20 20 nstvfs_xcall(.
50d0: 76 6f 69 64 20 2a 70 2c 0a 20 20 69 6e 74 20 65 void *p,. int e
50e0: 45 76 65 6e 74 2c 0a 20 20 73 71 6c 69 74 65 33 Event,. sqlite3
50f0: 5f 69 6e 74 36 34 20 6e 43 6c 69 63 6b 2c 0a 20 _int64 nClick,.
5100: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 const char *zNa
5110: 6d 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c me,. int flags,
5120: 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 0a 20 20 . int nByte,.
5130: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f sqlite3_int64 iO
5140: 66 66 73 65 74 0a 29 7b 0a 20 20 69 6e 74 20 72 ffset.){. int r
5150: 63 3b 0a 20 20 49 6e 73 74 56 66 73 43 61 6c 6c c;. InstVfsCall
5160: 20 2a 70 43 61 6c 6c 20 3d 20 28 49 6e 73 74 56 *pCall = (InstV
5170: 66 73 43 61 6c 6c 20 2a 29 70 3b 0a 20 20 54 63 fsCall *)p;. Tc
5180: 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 20 3d 20 54 63 l_Obj *pObj = Tc
5190: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 20 l_DuplicateObj(
51a0: 70 43 61 6c 6c 2d 3e 70 53 63 72 69 70 74 29 3b pCall->pScript);
51b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
51c0: 45 76 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f Event = sqlite3_
51d0: 69 6e 73 74 76 66 73 5f 6e 61 6d 65 28 65 45 76 instvfs_name(eEv
51e0: 65 6e 74 29 3b 0a 0a 20 20 54 63 6c 5f 49 6e 63 ent);.. Tcl_Inc
51f0: 72 52 65 66 43 6f 75 6e 74 28 70 4f 62 6a 29 3b rRefCount(pObj);
5200: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 . Tcl_ListObjAp
5210: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 pendElement(0, p
5220: 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Obj, Tcl_NewStri
5230: 6e 67 4f 62 6a 28 7a 45 76 65 6e 74 2c 20 2d 31 ngObj(zEvent, -1
5240: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ));. Tcl_ListOb
5250: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 jAppendElement(0
5260: 2c 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 57 , pObj, Tcl_NewW
5270: 69 64 65 49 6e 74 4f 62 6a 28 6e 43 6c 69 63 6b ideIntObj(nClick
5280: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ));. Tcl_ListOb
5290: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 jAppendElement(0
52a0: 2c 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 , pObj, Tcl_NewS
52b0: 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 tringObj(zName,
52c0: 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 -1));. Tcl_List
52d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
52e0: 28 30 2c 20 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65 (0, pObj, Tcl_Ne
52f0: 77 49 6e 74 4f 62 6a 28 6e 42 79 74 65 29 29 3b wIntObj(nByte));
5300: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 . Tcl_ListObjAp
5310: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 pendElement(0, p
5320: 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 Obj, Tcl_NewWide
5330: 49 6e 74 4f 62 6a 28 69 4f 66 66 73 65 74 29 29 IntObj(iOffset))
5340: 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 ;.. rc = Tcl_Ev
5350: 61 6c 4f 62 6a 45 78 28 70 43 61 6c 6c 2d 3e 69 alObjEx(pCall->i
5360: 6e 74 65 72 70 2c 20 70 4f 62 6a 2c 20 54 43 4c nterp, pObj, TCL
5370: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c _EVAL_GLOBAL|TCL
5380: 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 _EVAL_DIRECT);.
5390: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54 if( rc ){. T
53a0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 cl_BackgroundErr
53b0: 6f 72 28 70 43 61 6c 6c 2d 3e 69 6e 74 65 72 70 or(pCall->interp
53c0: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65 63 );. }. Tcl_Dec
53d0: 72 52 65 66 43 6f 75 6e 74 28 70 4f 62 6a 29 3b rRefCount(pObj);
53e0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .}..static void
53f0: 74 65 73 74 5f 69 6e 73 74 76 66 73 5f 78 64 65 test_instvfs_xde
5400: 6c 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 49 6e l(void *p){. In
5410: 73 74 56 66 73 43 61 6c 6c 20 2a 70 43 61 6c 6c stVfsCall *pCall
5420: 20 3d 20 28 49 6e 73 74 56 66 73 43 61 6c 6c 20 = (InstVfsCall
5430: 2a 29 70 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 *)p;. Tcl_DecrR
5440: 65 66 43 6f 75 6e 74 28 70 43 61 6c 6c 2d 3e 70 efCount(pCall->p
5450: 53 63 72 69 70 74 29 3b 0a 20 20 73 71 6c 69 74 Script);. sqlit
5460: 65 33 5f 66 72 65 65 28 70 43 61 6c 6c 29 3b 0a e3_free(pCall);.
5470: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 }..static int te
5480: 73 74 5f 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 st_sqlite3_instv
5490: 66 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 fs(. void * cli
54a0: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 entData,. Tcl_I
54b0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 nterp *interp,.
54c0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c int objc,. Tcl
54d0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 _Obj *CONST objv
54e0: 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 [].){. static c
54f0: 6f 6e 73 74 20 63 68 61 72 20 2a 49 56 5f 73 74 onst char *IV_st
5500: 72 73 5b 5d 20 3d 20 0a 20 20 20 20 20 20 20 20 rs[] = .
5510: 20 20 20 20 20 20 20 7b 20 22 63 72 65 61 74 65 { "create
5520: 22 2c 20 20 22 64 65 73 74 72 6f 79 22 2c 20 20 ", "destroy",
5530: 22 72 65 73 65 74 22 2c 20 20 22 72 65 70 6f 72 "reset", "repor
5540: 74 22 2c 20 22 63 6f 6e 66 69 67 75 72 65 22 2c t", "configure",
5550: 20 22 62 69 6e 61 72 79 6c 6f 67 22 2c 20 30 20 "binarylog", 0
5560: 7d 3b 0a 20 20 65 6e 75 6d 20 49 56 5f 65 6e 75 };. enum IV_enu
5570: 6d 20 7b 20 49 56 5f 43 52 45 41 54 45 2c 20 49 m { IV_CREATE, I
5580: 56 5f 44 45 53 54 52 4f 59 2c 20 49 56 5f 52 45 V_DESTROY, IV_RE
5590: 53 45 54 2c 20 49 56 5f 52 45 50 4f 52 54 2c 20 SET, IV_REPORT,
55a0: 49 56 5f 43 4f 4e 46 49 47 55 52 45 2c 20 49 56 IV_CONFIGURE, IV
55b0: 5f 42 49 4e 41 52 59 4c 4f 47 20 7d 3b 0a 20 20 _BINARYLOG };.
55c0: 69 6e 74 20 69 53 75 62 3b 0a 0a 20 20 69 66 28 int iSub;.. if(
55d0: 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 objc<2 ){. T
55e0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
55f0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
5600: 20 22 53 55 42 2d 43 4f 4d 4d 41 4e 44 20 2e 2e "SUB-COMMAND ..
5610: 2e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 .");. }. if( T
5620: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f cl_GetIndexFromO
5630: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
5640: 31 5d 2c 20 49 56 5f 73 74 72 73 2c 20 22 73 75 1], IV_strs, "su
5650: 62 2d 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 b-command", 0, &
5660: 69 53 75 62 29 20 29 7b 0a 20 20 20 20 72 65 74 iSub) ){. ret
5670: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
5680: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65 }.. switch( (e
5690: 6e 75 6d 20 49 56 5f 65 6e 75 6d 29 69 53 75 62 num IV_enum)iSub
56a0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 49 56 5f ){. case IV_
56b0: 43 52 45 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 CREATE: {.
56c0: 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 20 3d 20 char *zParent =
56d0: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 0;. sqlite3
56e0: 5f 76 66 73 20 2a 70 3b 0a 20 20 20 20 20 20 69 _vfs *p;. i
56f0: 6e 74 20 69 73 44 65 66 61 75 6c 74 20 3d 20 30 nt isDefault = 0
5700: 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 ;. if( objc
5710: 3e 32 20 26 26 20 30 3d 3d 73 74 72 63 6d 70 28 >2 && 0==strcmp(
5720: 22 2d 64 65 66 61 75 6c 74 22 2c 20 54 63 6c 5f "-default", Tcl_
5730: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 GetString(objv[2
5740: 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 ])) ){. i
5750: 73 44 65 66 61 75 6c 74 20 3d 20 31 3b 0a 20 20 sDefault = 1;.
5760: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 }. if(
5770: 28 6f 62 6a 63 2d 69 73 44 65 66 61 75 6c 74 29 (objc-isDefault)
5780: 21 3d 34 20 26 26 20 28 6f 62 6a 63 2d 69 73 44 !=4 && (objc-isD
5790: 65 66 61 75 6c 74 29 21 3d 33 20 29 7b 0a 20 20 efault)!=3 ){.
57a0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e Tcl_WrongN
57b0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 umArgs(interp, 2
57c0: 2c 20 6f 62 6a 76 2c 20 22 3f 2d 64 65 66 61 75 , objv, "?-defau
57d0: 6c 74 3f 20 4e 41 4d 45 20 3f 50 41 52 45 4e 54 lt? NAME ?PARENT
57e0: 2d 56 46 53 3f 22 29 3b 0a 20 20 20 20 20 20 20 -VFS?");.
57f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
5800: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 R;. }.
5810: 20 69 66 28 20 6f 62 6a 63 3d 3d 28 34 2b 69 73 if( objc==(4+is
5820: 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 Default) ){.
5830: 20 20 20 20 7a 50 61 72 65 6e 74 20 3d 20 54 63 zParent = Tc
5840: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
5850: 5b 33 2b 69 73 44 65 66 61 75 6c 74 5d 29 3b 0a [3+isDefault]);.
5860: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 20 }. p
5870: 3d 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 = sqlite3_instvf
5880: 73 5f 63 72 65 61 74 65 28 54 63 6c 5f 47 65 74 s_create(Tcl_Get
5890: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 2b 69 73 String(objv[2+is
58a0: 44 65 66 61 75 6c 74 5d 29 2c 20 7a 50 61 72 65 Default]), zPare
58b0: 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 nt);. if( !
58c0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c p ){. Tcl
58d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
58e0: 74 65 72 70 2c 20 22 65 72 72 6f 72 20 63 72 65 terp, "error cre
58f0: 61 74 69 6e 67 20 76 66 73 20 22 2c 20 30 29 3b ating vfs ", 0);
5900: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 . return
5910: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 TCL_ERROR;.
5920: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 44 }. if( isD
5930: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 efault ){.
5940: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 sqlite3_vfs_re
5950: 67 69 73 74 65 72 28 70 2c 20 31 29 3b 0a 20 20 gister(p, 1);.
5960: 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f }. Tcl_
5970: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
5980: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 29 3b 0a 20 erp, objv[2]);.
5990: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
59a0: 7d 0a 20 20 20 20 63 61 73 65 20 49 56 5f 42 49 }. case IV_BI
59b0: 4e 41 52 59 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 NARYLOG: {.
59c0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 char *zName = 0
59d0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4c ;. char *zL
59e0: 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 og = 0;. sq
59f0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 3b 0a 20 20 lite3_vfs *p;.
5a00: 20 20 20 20 69 6e 74 20 69 73 44 65 66 61 75 6c int isDefaul
5a10: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 t = 0;. if(
5a20: 20 6f 62 6a 63 3e 32 20 26 26 20 30 3d 3d 73 74 objc>2 && 0==st
5a30: 72 63 6d 70 28 22 2d 64 65 66 61 75 6c 74 22 2c rcmp("-default",
5a40: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f Tcl_GetString(o
5a50: 62 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20 bjv[2])) ){.
5a60: 20 20 20 20 69 73 44 65 66 61 75 6c 74 20 3d 20 isDefault =
5a70: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 1;. }.
5a80: 20 69 66 28 20 28 6f 62 6a 63 2d 69 73 44 65 66 if( (objc-isDef
5a90: 61 75 6c 74 29 21 3d 34 20 29 7b 0a 20 20 20 20 ault)!=4 ){.
5aa0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d Tcl_WrongNum
5ab0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 Args(interp, 2,
5ac0: 6f 62 6a 76 2c 20 22 3f 2d 64 65 66 61 75 6c 74 objv, "?-default
5ad0: 3f 20 4e 41 4d 45 20 4c 4f 47 46 49 4c 45 22 29 ? NAME LOGFILE")
5ae0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e ;. return
5af0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
5b00: 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 }. zName
5b10: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 = Tcl_GetString(
5b20: 6f 62 6a 76 5b 32 2b 69 73 44 65 66 61 75 6c 74 objv[2+isDefault
5b30: 5d 29 3b 0a 20 20 20 20 20 20 7a 4c 6f 67 20 3d ]);. zLog =
5b40: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f Tcl_GetString(o
5b50: 62 6a 76 5b 33 2b 69 73 44 65 66 61 75 6c 74 5d bjv[3+isDefault]
5b60: 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c );. p = sql
5b70: 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 62 69 6e ite3_instvfs_bin
5b80: 61 72 79 6c 6f 67 28 7a 4e 61 6d 65 2c 20 30 2c arylog(zName, 0,
5b90: 20 7a 4c 6f 67 29 3b 0a 20 20 20 20 20 20 69 66 zLog);. if
5ba0: 28 20 21 70 20 29 7b 0a 20 20 20 20 20 20 20 20 ( !p ){.
5bb0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
5bc0: 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 20 (interp, "error
5bd0: 63 72 65 61 74 69 6e 67 20 76 66 73 20 22 2c 20 creating vfs ",
5be0: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 0);. retu
5bf0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
5c00: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 }. if(
5c10: 69 73 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 isDefault ){.
5c20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 sqlite3_vfs
5c30: 5f 72 65 67 69 73 74 65 72 28 70 2c 20 31 29 3b _register(p, 1);
5c40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 . }. T
5c50: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
5c60: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 29 interp, objv[2])
5c70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 ;. break;.
5c80: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 49 }.. case I
5c90: 56 5f 43 4f 4e 46 49 47 55 52 45 3a 20 7b 0a 20 V_CONFIGURE: {.
5ca0: 20 20 20 20 20 49 6e 73 74 56 66 73 43 61 6c 6c InstVfsCall
5cb0: 20 2a 70 43 61 6c 6c 3b 0a 0a 20 20 20 20 20 20 *pCall;..
5cc0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 3b 0a sqlite3_vfs *p;.
5cd0: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d if( objc!=
5ce0: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 4 ){. Tcl
5cf0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
5d00: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 terp, 2, objv, "
5d10: 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20 NAME SCRIPT");.
5d20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 return TC
5d30: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d L_ERROR;. }
5d40: 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 . p = sqlit
5d50: 65 33 5f 76 66 73 5f 66 69 6e 64 28 54 63 6c 5f e3_vfs_find(Tcl_
5d60: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 GetString(objv[2
5d70: 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 ]));. if( !
5d80: 70 20 7c 7c 20 70 2d 3e 78 4f 70 65 6e 21 3d 69 p || p->xOpen!=i
5d90: 6e 73 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 nstOpen ){.
5da0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
5db0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 ult(interp, "no
5dc0: 73 75 63 68 20 76 66 73 3a 20 22 2c 20 54 63 6c such vfs: ", Tcl
5dd0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
5de0: 32 5d 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 2]), 0);.
5df0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
5e00: 52 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 R;. }..
5e10: 20 20 69 66 28 20 73 74 72 6c 65 6e 28 54 63 6c if( strlen(Tcl
5e20: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
5e30: 33 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 3])) ){.
5e40: 70 43 61 6c 6c 20 3d 20 28 49 6e 73 74 56 66 73 pCall = (InstVfs
5e50: 43 61 6c 6c 20 2a 29 73 71 6c 69 74 65 33 5f 6d Call *)sqlite3_m
5e60: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 49 6e 73 alloc(sizeof(Ins
5e70: 74 56 66 73 43 61 6c 6c 29 29 3b 0a 20 20 20 20 tVfsCall));.
5e80: 20 20 20 20 70 43 61 6c 6c 2d 3e 69 6e 74 65 72 pCall->inter
5e90: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 p = interp;.
5ea0: 20 20 20 20 70 43 61 6c 6c 2d 3e 70 53 63 72 69 pCall->pScri
5eb0: 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 pt = Tcl_Duplica
5ec0: 74 65 4f 62 6a 28 6f 62 6a 76 5b 33 5d 29 3b 0a teObj(objv[3]);.
5ed0: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 Tcl_Incr
5ee0: 52 65 66 43 6f 75 6e 74 28 70 43 61 6c 6c 2d 3e RefCount(pCall->
5ef0: 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 20 20 pScript);.
5f00: 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 sqlite3_instvf
5f10: 73 5f 63 6f 6e 66 69 67 75 72 65 28 70 2c 20 0a s_configure(p, .
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 test
5f30: 5f 69 6e 73 74 76 66 73 5f 78 63 61 6c 6c 2c 20 _instvfs_xcall,
5f40: 28 76 6f 69 64 20 2a 29 70 43 61 6c 6c 2c 20 74 (void *)pCall, t
5f50: 65 73 74 5f 69 6e 73 74 76 66 73 5f 78 64 65 6c est_instvfs_xdel
5f60: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 . );.
5f70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
5f80: 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 sqlite3_instvfs
5f90: 5f 63 6f 6e 66 69 67 75 72 65 28 70 2c 20 30 2c _configure(p, 0,
5fa0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0, 0);. }.
5fb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
5fc0: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 49 56 5f }.. case IV_
5fd0: 52 45 50 4f 52 54 3a 0a 20 20 20 20 63 61 73 65 REPORT:. case
5fe0: 20 49 56 5f 44 45 53 54 52 4f 59 3a 0a 20 20 20 IV_DESTROY:.
5ff0: 20 63 61 73 65 20 49 56 5f 52 45 53 45 54 3a 20 case IV_RESET:
6000: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f {. sqlite3_
6010: 76 66 73 20 2a 70 3b 0a 20 20 20 20 20 20 69 66 vfs *p;. if
6020: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 ( objc!=3 ){.
6030: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 Tcl_WrongNu
6040: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c mArgs(interp, 2,
6050: 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 22 29 3b 0a objv, "NAME");.
6060: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 return T
6070: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 CL_ERROR;.
6080: 7d 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69 }. p = sqli
6090: 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 54 63 6c te3_vfs_find(Tcl
60a0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
60b0: 32 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 2]));. if(
60c0: 21 70 20 7c 7c 20 70 2d 3e 78 4f 70 65 6e 21 3d !p || p->xOpen!=
60d0: 69 6e 73 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 instOpen ){.
60e0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
60f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f sult(interp, "no
6100: 20 73 75 63 68 20 76 66 73 3a 20 22 2c 20 54 63 such vfs: ", Tc
6110: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 l_GetString(objv
6120: 5b 32 5d 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 [2]), 0);.
6130: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
6140: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 OR;. }..
6150: 20 20 20 69 66 28 20 28 28 65 6e 75 6d 20 49 56 if( ((enum IV
6160: 5f 65 6e 75 6d 29 69 53 75 62 29 3d 3d 49 56 5f _enum)iSub)==IV_
6170: 44 45 53 54 52 4f 59 20 29 7b 0a 20 20 20 20 20 DESTROY ){.
6180: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 sqlite3_instv
6190: 66 73 5f 64 65 73 74 72 6f 79 28 70 29 3b 0a 20 fs_destroy(p);.
61a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 }. if(
61b0: 20 28 28 65 6e 75 6d 20 49 56 5f 65 6e 75 6d 29 ((enum IV_enum)
61c0: 69 53 75 62 29 3d 3d 49 56 5f 52 45 53 45 54 20 iSub)==IV_RESET
61d0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 ){. sqlit
61e0: 65 33 5f 69 6e 73 74 76 66 73 5f 72 65 73 65 74 e3_instvfs_reset
61f0: 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 (p);. }.
6200: 20 20 20 69 66 28 20 28 28 65 6e 75 6d 20 49 56 if( ((enum IV
6210: 5f 65 6e 75 6d 29 69 53 75 62 29 3d 3d 49 56 5f _enum)iSub)==IV_
6220: 52 45 50 4f 52 54 20 29 7b 0a 20 20 20 20 20 20 REPORT ){.
6230: 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 int ii;.
6240: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 Tcl_Obj *pRet
6250: 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a = Tcl_NewObj();.
6260: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 . const c
6270: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 68 har *zName = (ch
6280: 61 72 20 2a 29 31 3b 0a 20 20 20 20 20 20 20 20 ar *)1;.
6290: 69 36 34 20 6e 43 6c 69 63 6b 3b 0a 20 20 20 20 i64 nClick;.
62a0: 20 20 20 20 69 6e 74 20 6e 43 61 6c 6c 3b 0a 20 int nCall;.
62b0: 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 31 3b for(ii=1;
62c0: 20 7a 4e 61 6d 65 3b 20 69 69 2b 2b 29 7b 0a 20 zName; ii++){.
62d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
62e0: 5f 69 6e 73 74 76 66 73 5f 67 65 74 28 70 2c 20 _instvfs_get(p,
62f0: 69 69 2c 20 26 7a 4e 61 6d 65 2c 20 26 6e 43 6c ii, &zName, &nCl
6300: 69 63 6b 2c 20 26 6e 43 61 6c 6c 29 3b 0a 20 20 ick, &nCall);.
6310: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d if( zNam
6320: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 e ){.
6330: 20 54 63 6c 5f 4f 62 6a 20 2a 70 45 6c 65 6d 20 Tcl_Obj *pElem
6340: 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a = Tcl_NewObj();.
6350: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f Tcl_
6360: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
6370: 6d 65 6e 74 28 30 2c 20 70 45 6c 65 6d 2c 20 54 ment(0, pElem, T
6380: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
6390: 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 20 zName, -1));.
63a0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 Tcl_Lis
63b0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
63c0: 74 28 30 2c 20 70 45 6c 65 6d 2c 20 54 63 6c 5f t(0, pElem, Tcl_
63d0: 4e 65 77 49 6e 74 4f 62 6a 28 6e 43 61 6c 6c 29 NewIntObj(nCall)
63e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 );. T
63f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
6400: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 45 6c 65 6d Element(0, pElem
6410: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 , Tcl_NewWideInt
6420: 4f 62 6a 28 6e 43 6c 69 63 6b 29 29 3b 0a 20 20 Obj(nClick));.
6430: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 Tcl_Li
6440: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
6450: 6e 74 28 30 2c 20 70 52 65 74 2c 20 70 45 6c 65 nt(0, pRet, pEle
6460: 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a m);. }.
6470: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 }..
6480: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
6490: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 ult(interp, pRet
64a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 );. }..
64b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 break;. }.
64c0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c }.. return TCL
64d0: 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 53 71 6c 69 _OK;.}..int Sqli
64e0: 74 65 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 tetestOsinst_Ini
64f0: 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e t(Tcl_Interp *in
6500: 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 terp){. Tcl_Cre
6510: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
6520: 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 69 terp, "sqlite3_i
6530: 6e 73 74 76 66 73 22 2c 20 74 65 73 74 5f 73 71 nstvfs", test_sq
6540: 6c 69 74 65 33 5f 69 6e 73 74 76 66 73 2c 20 30 lite3_instvfs, 0
6550: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 , 0);. return T
6560: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 CL_OK;.}..#endif
6570: 0a .