/ Hex Artifact Content
Login

Artifact 06da7e085dce42924cf062b91763dd4bb84c6101:


0000: 2f 2a 0a 2a 2a 20 32 30 30 37 20 53 65 70 74 65  /*.** 2007 Septe
0010: 6d 62 65 72 20 31 34 0a 2a 2a 0a 2a 2a 20 54 68  mber 14.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you 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 0a 2a 2a 0a 2a 2a 20 4f 56 45  ******.**.** OVE
0180: 52 56 49 45 57 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  RVIEW:.**.**   T
0190: 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  his file contain
01a0: 73 20 73 6f 6d 65 20 65 78 61 6d 70 6c 65 20 63  s some example c
01b0: 6f 64 65 20 64 65 6d 6f 6e 73 74 72 61 74 69 6e  ode demonstratin
01c0: 67 20 68 6f 77 20 74 68 65 20 53 51 4c 69 74 65  g how the SQLite
01d0: 20 0a 2a 2a 20 20 20 76 66 73 20 66 65 61 74 75   .**   vfs featu
01e0: 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  re can be used t
01f0: 6f 20 68 61 76 65 20 53 51 4c 69 74 65 20 6f 70  o have SQLite op
0200: 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f  erate directly o
0210: 6e 20 61 6e 20 0a 2a 2a 20 20 20 65 6d 62 65 64  n an .**   embed
0220: 64 65 64 20 6d 65 64 69 61 2c 20 77 69 74 68 6f  ded media, witho
0230: 75 74 20 75 73 69 6e 67 20 61 6e 20 69 6e 74 65  ut using an inte
0240: 72 6d 65 64 69 61 74 65 20 66 69 6c 65 20 73 79  rmediate file sy
0250: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 42 65  stem..**.**   Be
0260: 63 61 75 73 65 20 74 68 69 73 20 69 73 20 6f 6e  cause this is on
0270: 6c 79 20 61 20 64 65 6d 6f 20 64 65 73 69 67 6e  ly a demo design
0280: 65 64 20 74 6f 20 72 75 6e 20 6f 6e 20 61 20 77  ed to run on a w
0290: 6f 72 6b 73 74 61 74 69 6f 6e 2c 20 74 68 65 0a  orkstation, the.
02a0: 2a 2a 20 20 20 75 6e 64 65 72 6c 79 69 6e 67 20  **   underlying 
02b0: 6d 65 64 69 61 20 69 73 20 73 69 6d 75 6c 61 74  media is simulat
02c0: 65 64 20 75 73 69 6e 67 20 61 20 72 65 67 75 6c  ed using a regul
02d0: 61 72 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  ar file-system f
02e0: 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 20 20 73 69  ile. The.**   si
02f0: 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ze of the file i
0300: 73 20 66 69 78 65 64 20 77 68 65 6e 20 69 74 20  s fixed when it 
0310: 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65 64  is first created
0320: 20 28 64 65 66 61 75 6c 74 20 73 69 7a 65 20 31   (default size 1
0330: 30 20 4d 42 29 2e 0a 2a 2a 20 20 20 46 72 6f 6d  0 MB)..**   From
0340: 20 53 51 4c 69 74 65 27 73 20 70 6f 69 6e 74 20   SQLite's point 
0350: 6f 66 20 76 69 65 77 2c 20 74 68 69 73 20 73 70  of view, this sp
0360: 61 63 65 20 69 73 20 75 73 65 64 20 74 6f 20 73  ace is used to s
0370: 74 6f 72 65 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  tore a single.**
0380: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0390: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
03a0: 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 20 20   file. .**.**   
03b0: 41 6e 79 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  Any statement jo
03c0: 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 69 73  urnal created is
03d0: 20 73 74 6f 72 65 64 20 69 6e 20 76 6f 6c 61 74   stored in volat
03e0: 69 6c 65 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  ile memory obtai
03f0: 6e 65 64 20 0a 2a 2a 20 20 20 66 72 6f 6d 20 73  ned .**   from s
0400: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
0410: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
0420: 63 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  create a tempora
0430: 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
0440: 20 0a 2a 2a 20 20 20 77 69 6c 6c 20 66 61 69 6c   .**   will fail
0450: 20 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e   (SQLITE_IOERR).
0460: 20 54 6f 20 70 72 65 76 65 6e 74 20 53 51 4c 69   To prevent SQLi
0470: 74 65 20 66 72 6f 6d 20 61 74 74 65 6d 70 74 69  te from attempti
0480: 6e 67 20 74 68 69 73 2c 0a 2a 2a 20 20 20 69 74  ng this,.**   it
0490: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6e 66 69   should be confi
04a0: 67 75 72 65 64 20 74 6f 20 73 74 6f 72 65 20 61  gured to store a
04b0: 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  ll temporary dat
04c0: 61 62 61 73 65 20 66 69 6c 65 73 20 69 6e 20 0a  abase files in .
04d0: 2a 2a 20 20 20 6d 61 69 6e 20 6d 65 6d 6f 72 79  **   main memory
04e0: 20 28 73 65 65 20 70 72 61 67 6d 61 20 22 74 65   (see pragma "te
04f0: 6d 70 5f 73 74 6f 72 65 22 20 6f 72 20 74 68 65  mp_store" or the
0500: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
0510: 52 45 20 63 6f 6d 70 69 6c 65 20 0a 2a 2a 20 20  RE compile .**  
0520: 20 74 69 6d 65 20 6f 70 74 69 6f 6e 29 2e 0a 2a   time option)..*
0530: 2a 0a 2a 2a 20 41 53 53 55 4d 50 54 49 4f 4e 53  *.** ASSUMPTIONS
0540: 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 66 74 65 72 20  :.**.**   After 
0550: 69 74 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  it has been crea
0560: 74 65 64 2c 20 74 68 65 20 62 6c 6f 62 20 66 69  ted, the blob fi
0570: 6c 65 20 69 73 20 61 63 63 65 73 73 65 64 20 75  le is accessed u
0580: 73 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 66 6f  sing the.**   fo
0590: 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75  llowing three fu
05a0: 6e 63 74 69 6f 6e 73 20 6f 6e 6c 79 3a 0a 2a 2a  nctions only:.**
05b0: 0a 2a 2a 20 20 20 20 20 20 20 6d 65 64 69 61 52  .**       mediaR
05c0: 65 61 64 28 29 3b 20 20 20 20 20 20 20 20 20 20  ead();          
05d0: 20 20 2d 20 52 65 61 64 20 61 20 35 31 32 20 62    - Read a 512 b
05e0: 79 74 65 20 62 6c 6f 63 6b 20 66 72 6f 6d 20 74  yte block from t
05f0: 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20  he file..**     
0600: 20 20 6d 65 64 69 61 57 72 69 74 65 28 29 3b 20    mediaWrite(); 
0610: 20 20 20 20 20 20 20 20 20 20 2d 20 57 72 69 74            - Writ
0620: 65 20 61 20 35 31 32 20 62 79 74 65 20 62 6c 6f  e a 512 byte blo
0630: 63 6b 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  ck to the file..
0640: 2a 2a 20 20 20 20 20 20 20 6d 65 64 69 61 53 79  **       mediaSy
0650: 6e 63 28 29 3b 20 20 20 20 20 20 20 20 20 20 20  nc();           
0660: 20 2d 20 54 65 6c 6c 20 74 68 65 20 6d 65 64 69   - Tell the medi
0670: 61 20 68 61 72 64 77 61 72 65 20 74 6f 20 73 79  a hardware to sy
0680: 6e 63 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69  nc..**.**   It i
0690: 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
06a0: 68 65 73 65 20 63 61 6e 20 62 65 20 65 61 73 69  hese can be easi
06b0: 6c 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  ly implemented b
06c0: 79 20 61 6e 79 20 22 72 65 61 6c 22 0a 2a 2a 20  y any "real".** 
06d0: 20 20 6d 65 64 69 61 20 76 66 73 20 64 72 69 76    media vfs driv
06e0: 65 72 20 61 64 61 70 74 69 6e 67 20 74 68 69 73  er adapting this
06f0: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 49 4c   code..**.** FIL
0700: 45 20 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20  E FORMAT:.**.** 
0710: 20 20 54 68 65 20 62 61 73 69 63 20 70 72 69 6e    The basic prin
0720: 63 69 70 6c 65 20 69 73 20 74 68 61 74 20 74 68  ciple is that th
0730: 65 20 22 64 61 74 61 62 61 73 65 20 66 69 6c 65  e "database file
0740: 22 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  " is stored at t
0750: 68 65 0a 2a 2a 20 20 20 62 65 67 69 6e 6e 69 6e  he.**   beginnin
0760: 67 20 6f 66 20 74 68 65 20 31 30 20 4d 42 20 62  g of the 10 MB b
0770: 6c 6f 62 20 61 6e 64 20 67 72 6f 77 73 20 69 6e  lob and grows in
0780: 20 61 20 66 6f 72 77 61 72 64 20 64 69 72 65 63   a forward direc
0790: 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 20 20  tion. The .**   
07a0: 22 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 22 20 69  "journal file" i
07b0: 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  s stored at the 
07c0: 65 6e 64 20 6f 66 20 74 68 65 20 31 30 4d 42 20  end of the 10MB 
07d0: 62 6c 6f 62 20 61 6e 64 20 67 72 6f 77 73 0a 2a  blob and grows.*
07e0: 2a 20 20 20 69 6e 20 74 68 65 20 72 65 76 65 72  *   in the rever
07f0: 73 65 20 64 69 72 65 63 74 69 6f 6e 2e 20 49 66  se direction. If
0800: 2c 20 64 75 72 69 6e 67 20 61 20 74 72 61 6e 73  , during a trans
0810: 61 63 74 69 6f 6e 2c 20 69 6e 73 75 66 66 69 63  action, insuffic
0820: 69 65 6e 74 0a 2a 2a 20 20 20 73 70 61 63 65 20  ient.**   space 
0830: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  is available to 
0840: 65 78 70 61 6e 64 20 65 69 74 68 65 72 20 74 68  expand either th
0850: 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74  e journal or dat
0860: 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20  abase file,.**  
0870: 20 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   an SQLITE_FULL 
0880: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
0890: 64 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  d. The database 
08a0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 61 6c  file is never al
08b0: 6c 6f 77 65 64 0a 2a 2a 20 20 20 74 6f 20 63 6f  lowed.**   to co
08c0: 6e 73 75 6d 65 20 6d 6f 72 65 20 74 68 61 6e 20  nsume more than 
08d0: 39 30 25 20 6f 66 20 74 68 65 20 62 6c 6f 62 20  90% of the blob 
08e0: 73 70 61 63 65 2e 20 49 66 20 53 51 4c 69 74 65  space. If SQLite
08f0: 20 74 72 69 65 73 20 74 6f 0a 2a 2a 20 20 20 63   tries to.**   c
0900: 72 65 61 74 65 20 61 20 66 69 6c 65 20 6c 61 72  reate a file lar
0910: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 53  ger than this, S
0920: 51 4c 49 54 45 5f 46 55 4c 4c 20 69 73 20 72 65  QLITE_FULL is re
0930: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  turned..**.**   
0940: 4e 6f 20 61 6c 6c 6f 77 61 6e 63 65 20 69 73 20  No allowance is 
0950: 6d 61 64 65 20 66 6f 72 20 22 77 65 61 72 2d 6c  made for "wear-l
0960: 65 76 65 6c 69 6e 67 22 2c 20 61 73 20 69 73 20  eveling", as is 
0970: 72 65 71 75 69 72 65 64 20 62 79 2e 0a 2a 2a 20  required by..** 
0980: 20 20 65 6d 62 65 64 64 65 64 20 64 65 76 69 63    embedded devic
0990: 65 73 20 69 6e 20 74 68 65 20 61 62 73 65 6e 63  es in the absenc
09a0: 65 20 6f 66 20 65 71 75 69 76 61 6c 65 6e 74 20  e of equivalent 
09b0: 68 61 72 64 77 61 72 65 20 66 65 61 74 75 72 65  hardware feature
09c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  s..**.**   The f
09d0: 69 72 73 74 20 35 31 32 20 62 6c 6f 63 6b 20 62  irst 512 block b
09e0: 79 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  yte of the file 
09f0: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
0a00: 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20  storing the.**  
0a10: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 22 64 61   size of the "da
0a20: 74 61 62 61 73 65 20 66 69 6c 65 22 2e 20 49 74  tabase file". It
0a30: 20 69 73 20 75 70 64 61 74 65 64 20 61 73 20 70   is updated as p
0a40: 61 72 74 20 6f 66 20 74 68 65 20 73 79 6e 63 28  art of the sync(
0a50: 29 0a 2a 2a 20 20 20 6f 70 65 72 61 74 69 6f 6e  ).**   operation
0a60: 2e 20 4f 6e 20 73 74 61 72 74 75 70 2c 20 69 74  . On startup, it
0a70: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 74 72 75   can only be tru
0a80: 73 74 65 64 20 69 66 20 6e 6f 20 6a 6f 75 72 6e  sted if no journ
0a90: 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 65 78 69  al file.**   exi
0aa0: 73 74 73 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61  sts. If a journa
0ab0: 6c 2d 66 69 6c 65 20 64 6f 65 73 20 65 78 69 73  l-file does exis
0ac0: 74 2c 20 74 68 65 6e 20 69 74 20 73 74 6f 72 65  t, then it store
0ad0: 73 20 74 68 65 20 72 65 61 6c 20 73 69 7a 65 0a  s the real size.
0ae0: 2a 2a 20 20 20 6f 66 20 74 68 65 20 64 61 74 61  **   of the data
0af0: 62 61 73 65 20 72 65 67 69 6f 6e 2e 20 54 68 65  base region. The
0b00: 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73   second and subs
0b10: 65 71 75 65 6e 74 20 62 6c 6f 63 6b 73 20 73 74  equent blocks st
0b20: 6f 72 65 20 74 68 65 20 0a 2a 2a 20 20 20 61 63  ore the .**   ac
0b30: 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 63 6f  tual database co
0b40: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  ntent..**.**   T
0b50: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 22  he size of the "
0b60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 22 20 69 73  journal file" is
0b70: 20 6e 6f 74 20 73 74 6f 72 65 64 20 70 65 72 73   not stored pers
0b80: 69 73 74 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  istently in the 
0b90: 0a 2a 2a 20 20 20 66 69 6c 65 2e 20 57 68 65 6e  .**   file. When
0ba0: 20 74 68 65 20 73 79 73 74 65 6d 20 69 73 20 72   the system is r
0bb0: 75 6e 6e 69 6e 67 2c 20 74 68 65 20 73 69 7a 65  unning, the size
0bc0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
0bd0: 66 69 6c 65 20 69 73 0a 2a 2a 20 20 20 73 74 6f  file is.**   sto
0be0: 72 65 64 20 69 6e 20 76 6f 6c 61 74 69 6c 65 20  red in volatile 
0bf0: 6d 65 6d 6f 72 79 2e 20 57 68 65 6e 20 72 65 63  memory. When rec
0c00: 6f 76 65 72 69 6e 67 20 66 72 6f 6d 20 61 20 63  overing from a c
0c10: 72 61 73 68 2c 20 74 68 69 73 20 76 66 73 0a 2a  rash, this vfs.*
0c20: 2a 20 20 20 72 65 70 6f 72 74 73 20 61 20 76 65  *   reports a ve
0c30: 72 79 20 6c 61 72 67 65 20 73 69 7a 65 20 66 6f  ry large size fo
0c40: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
0c50: 6c 65 2e 20 54 68 65 20 6e 6f 72 6d 61 6c 20 6a  le. The normal j
0c60: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 68 65 61 64  ournal.**   head
0c70: 65 72 20 61 6e 64 20 63 68 65 63 6b 73 75 6d 20  er and checksum 
0c80: 6d 65 63 68 61 6e 69 73 6d 73 20 73 65 72 76 65  mechanisms serve
0c90: 20 74 6f 20 70 72 65 76 65 6e 74 20 53 51 4c 69   to prevent SQLi
0ca0: 74 65 20 66 72 6f 6d 20 0a 2a 2a 20 20 20 70 72  te from .**   pr
0cb0: 6f 63 65 73 73 69 6e 67 20 61 6e 79 20 64 61 74  ocessing any dat
0cc0: 61 20 74 68 61 74 20 6c 69 65 73 20 70 61 73 74  a that lies past
0cd0: 20 74 68 65 20 6c 6f 67 69 63 61 6c 20 65 6e 64   the logical end
0ce0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   of the journal.
0cf0: 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 53 51  .**.**   When SQ
0d00: 4c 69 74 65 20 63 61 6c 6c 73 20 4f 73 44 65 6c  Lite calls OsDel
0d10: 65 74 65 28 29 20 74 6f 20 64 65 6c 65 74 65 20  ete() to delete 
0d20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
0d30: 2c 20 74 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 20  , the final.**  
0d40: 20 35 31 32 20 62 79 74 65 73 20 6f 66 20 74 68   512 bytes of th
0d50: 65 20 62 6c 6f 62 20 28 74 68 65 20 61 72 65 61  e blob (the area
0d60: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
0d70: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
0d80: 61 64 65 72 29 0a 2a 2a 20 20 20 61 72 65 20 7a  ader).**   are z
0d90: 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 4c 4f 43  eroed..**.** LOC
0da0: 4b 49 4e 47 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 69  KING:.**.**   Fi
0db0: 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20  le locking is a 
0dc0: 6e 6f 2d 6f 70 2e 20 4f 6e 6c 79 20 6f 6e 65 20  no-op. Only one 
0dd0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 79 20 62  connection may b
0de0: 65 20 6f 70 65 6e 20 61 74 20 61 6e 79 20 6f 6e  e open at any on
0df0: 65 0a 2a 2a 20 20 20 74 69 6d 65 20 75 73 69 6e  e.**   time usin
0e00: 67 20 74 68 69 73 20 64 65 6d 6f 20 76 66 73 2e  g this demo vfs.
0e10: 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73  .*/..#include "s
0e20: 71 6c 69 74 65 33 2e 68 22 0a 23 69 6e 63 6c 75  qlite3.h".#inclu
0e30: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69  de <assert.h>.#i
0e40: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
0e50: 3e 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  >../*.** Maximum
0e60: 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68   pathname length
0e70: 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 74 68   supported by th
0e80: 65 20 66 73 20 62 61 63 6b 65 6e 64 2e 0a 2a 2f  e fs backend..*/
0e90: 0a 23 64 65 66 69 6e 65 20 42 4c 4f 43 4b 53 49  .#define BLOCKSI
0ea0: 5a 45 20 35 31 32 0a 23 64 65 66 69 6e 65 20 42  ZE 512.#define B
0eb0: 4c 4f 42 53 49 5a 45 20 31 30 34 38 35 37 36 30  LOBSIZE 10485760
0ec0: 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 75 73 65  ../*.** Name use
0ed0: 64 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  d to identify th
0ee0: 69 73 20 56 46 53 2e 0a 2a 2f 0a 23 64 65 66 69  is VFS..*/.#defi
0ef0: 6e 65 20 46 53 5f 56 46 53 5f 4e 41 4d 45 20 22  ne FS_VFS_NAME "
0f00: 66 73 22 0a 0a 74 79 70 65 64 65 66 20 73 74 72  fs"..typedef str
0f10: 75 63 74 20 66 73 5f 72 65 61 6c 5f 66 69 6c 65  uct fs_real_file
0f20: 20 66 73 5f 72 65 61 6c 5f 66 69 6c 65 3b 0a 73   fs_real_file;.s
0f30: 74 72 75 63 74 20 66 73 5f 72 65 61 6c 5f 66 69  truct fs_real_fi
0f40: 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  le {.  sqlite3_f
0f50: 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 20 20 63 6f  ile *pFile;.  co
0f60: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
0f70: 0a 20 20 69 6e 74 20 6e 44 61 74 61 62 61 73 65  .  int nDatabase
0f80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
0f90: 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  * Current size o
0fa0: 66 20 64 61 74 61 62 61 73 65 20 72 65 67 69 6f  f database regio
0fb0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4a 6f 75 72  n */.  int nJour
0fc0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
0fd0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69     /* Current si
0fe0: 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65  ze of journal re
0ff0: 67 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  gion */.  int nB
1000: 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
1010: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
1020: 69 7a 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  ize of allocated
1030: 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 6e   blob */.  int n
1040: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
1050: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1060: 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
1070: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
1080: 2f 0a 20 20 66 73 5f 72 65 61 6c 5f 66 69 6c 65  /.  fs_real_file
1090: 20 2a 70 4e 65 78 74 3b 0a 20 20 66 73 5f 72 65   *pNext;.  fs_re
10a0: 61 6c 5f 66 69 6c 65 20 2a 2a 70 70 54 68 69 73  al_file **ppThis
10b0: 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74  ;.};..typedef st
10c0: 72 75 63 74 20 66 73 5f 66 69 6c 65 20 66 73 5f  ruct fs_file fs_
10d0: 66 69 6c 65 3b 0a 73 74 72 75 63 74 20 66 73 5f  file;.struct fs_
10e0: 66 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  file {.  sqlite3
10f0: 5f 66 69 6c 65 20 62 61 73 65 3b 0a 20 20 69 6e  _file base;.  in
1100: 74 20 65 54 79 70 65 3b 0a 20 20 66 73 5f 72 65  t eType;.  fs_re
1110: 61 6c 5f 66 69 6c 65 20 2a 70 52 65 61 6c 3b 0a  al_file *pReal;.
1120: 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  };..typedef stru
1130: 63 74 20 74 6d 70 5f 66 69 6c 65 20 74 6d 70 5f  ct tmp_file tmp_
1140: 66 69 6c 65 3b 0a 73 74 72 75 63 74 20 74 6d 70  file;.struct tmp
1150: 5f 66 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65  _file {.  sqlite
1160: 33 5f 66 69 6c 65 20 62 61 73 65 3b 0a 20 20 69  3_file base;.  i
1170: 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 69 6e 74 20  nt nSize;.  int 
1180: 6e 41 6c 6c 6f 63 3b 0a 20 20 63 68 61 72 20 2a  nAlloc;.  char *
1190: 7a 41 6c 6c 6f 63 3b 0a 7d 3b 0a 0a 2f 2a 20 56  zAlloc;.};../* V
11a0: 61 6c 75 65 73 20 66 6f 72 20 66 73 5f 66 69 6c  alues for fs_fil
11b0: 65 2e 65 54 79 70 65 2e 20 2a 2f 0a 23 64 65 66  e.eType. */.#def
11c0: 69 6e 65 20 44 41 54 41 42 41 53 45 5f 46 49 4c  ine DATABASE_FIL
11d0: 45 20 20 20 31 0a 23 64 65 66 69 6e 65 20 4a 4f  E   1.#define JO
11e0: 55 52 4e 41 4c 5f 46 49 4c 45 20 20 20 20 32 0a  URNAL_FILE    2.
11f0: 0a 2f 2a 0a 2a 2a 20 4d 65 74 68 6f 64 20 64 65  ./*.** Method de
1200: 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f 72 20 66  clarations for f
1210: 73 5f 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  s_file..*/.stati
1220: 63 20 69 6e 74 20 66 73 43 6c 6f 73 65 28 73 71  c int fsClose(sq
1230: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74  lite3_file*);.st
1240: 61 74 69 63 20 69 6e 74 20 66 73 52 65 61 64 28  atic int fsRead(
1250: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 76  sqlite3_file*, v
1260: 6f 69 64 2a 2c 20 69 6e 74 20 69 41 6d 74 2c 20  oid*, int iAmt, 
1270: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
1280: 66 73 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  fst);.static int
1290: 20 66 73 57 72 69 74 65 28 73 71 6c 69 74 65 33   fsWrite(sqlite3
12a0: 5f 66 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 76 6f  _file*, const vo
12b0: 69 64 2a 2c 20 69 6e 74 20 69 41 6d 74 2c 20 73  id*, int iAmt, s
12c0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66  qlite3_int64 iOf
12d0: 73 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  st);.static int 
12e0: 66 73 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74  fsTruncate(sqlit
12f0: 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74 65  e3_file*, sqlite
1300: 33 5f 69 6e 74 36 34 20 73 69 7a 65 29 3b 0a 73  3_int64 size);.s
1310: 74 61 74 69 63 20 69 6e 74 20 66 73 53 79 6e 63  tatic int fsSync
1320: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
1330: 69 6e 74 20 66 6c 61 67 73 29 3b 0a 73 74 61 74  int flags);.stat
1340: 69 63 20 69 6e 74 20 66 73 46 69 6c 65 53 69 7a  ic int fsFileSiz
1350: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  e(sqlite3_file*,
1360: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
1370: 70 53 69 7a 65 29 3b 0a 73 74 61 74 69 63 20 69  pSize);.static i
1380: 6e 74 20 66 73 4c 6f 63 6b 28 73 71 6c 69 74 65  nt fsLock(sqlite
1390: 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73  3_file*, int);.s
13a0: 74 61 74 69 63 20 69 6e 74 20 66 73 55 6e 6c 6f  tatic int fsUnlo
13b0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
13c0: 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
13d0: 6e 74 20 66 73 43 68 65 63 6b 52 65 73 65 72 76  nt fsCheckReserv
13e0: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
13f0: 69 6c 65 2a 2c 20 69 6e 74 20 2a 70 52 65 73 4f  ile*, int *pResO
1400: 75 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  ut);.static int 
1410: 66 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  fsFileControl(sq
1420: 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
1430: 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
1440: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 66 73 53  ;.static int fsS
1450: 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
1460: 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63  3_file*);.static
1470: 20 69 6e 74 20 66 73 44 65 76 69 63 65 43 68 61   int fsDeviceCha
1480: 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c  racteristics(sql
1490: 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 0a 2f 2a  ite3_file*);../*
14a0: 0a 2a 2a 20 4d 65 74 68 6f 64 20 64 65 63 6c 61  .** Method decla
14b0: 72 61 74 69 6f 6e 73 20 66 6f 72 20 74 6d 70 5f  rations for tmp_
14c0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
14d0: 69 6e 74 20 74 6d 70 43 6c 6f 73 65 28 73 71 6c  int tmpClose(sql
14e0: 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61  ite3_file*);.sta
14f0: 74 69 63 20 69 6e 74 20 74 6d 70 52 65 61 64 28  tic int tmpRead(
1500: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 76  sqlite3_file*, v
1510: 6f 69 64 2a 2c 20 69 6e 74 20 69 41 6d 74 2c 20  oid*, int iAmt, 
1520: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
1530: 66 73 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  fst);.static int
1540: 20 74 6d 70 57 72 69 74 65 28 73 71 6c 69 74 65   tmpWrite(sqlite
1550: 33 5f 66 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 76  3_file*, const v
1560: 6f 69 64 2a 2c 20 69 6e 74 20 69 41 6d 74 2c 20  oid*, int iAmt, 
1570: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
1580: 66 73 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  fst);.static int
1590: 20 74 6d 70 54 72 75 6e 63 61 74 65 28 73 71 6c   tmpTruncate(sql
15a0: 69 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69  ite3_file*, sqli
15b0: 74 65 33 5f 69 6e 74 36 34 20 73 69 7a 65 29 3b  te3_int64 size);
15c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 6d 70 53  .static int tmpS
15d0: 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ync(sqlite3_file
15e0: 2a 2c 20 69 6e 74 20 66 6c 61 67 73 29 3b 0a 73  *, int flags);.s
15f0: 74 61 74 69 63 20 69 6e 74 20 74 6d 70 46 69 6c  tatic int tmpFil
1600: 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
1610: 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  le*, sqlite3_int
1620: 36 34 20 2a 70 53 69 7a 65 29 3b 0a 73 74 61 74  64 *pSize);.stat
1630: 69 63 20 69 6e 74 20 74 6d 70 4c 6f 63 6b 28 73  ic int tmpLock(s
1640: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
1650: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74  t);.static int t
1660: 6d 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  mpUnlock(sqlite3
1670: 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74  _file*, int);.st
1680: 61 74 69 63 20 69 6e 74 20 74 6d 70 43 68 65 63  atic int tmpChec
1690: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
16a0: 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
16b0: 20 2a 70 52 65 73 4f 75 74 29 3b 0a 73 74 61 74   *pResOut);.stat
16c0: 69 63 20 69 6e 74 20 74 6d 70 46 69 6c 65 43 6f  ic int tmpFileCo
16d0: 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
16e0: 6c 65 2a 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  le*, int op, voi
16f0: 64 20 2a 70 41 72 67 29 3b 0a 73 74 61 74 69 63  d *pArg);.static
1700: 20 69 6e 74 20 74 6d 70 53 65 63 74 6f 72 53 69   int tmpSectorSi
1710: 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ze(sqlite3_file*
1720: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74 6d  );.static int tm
1730: 70 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  pDeviceCharacter
1740: 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66  istics(sqlite3_f
1750: 69 6c 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65  ile*);../*.** Me
1760: 74 68 6f 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  thod declaration
1770: 73 20 66 6f 72 20 66 73 5f 76 66 73 2e 0a 2a 2f  s for fs_vfs..*/
1780: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 73 4f 70  .static int fsOp
1790: 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  en(sqlite3_vfs*,
17a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 73   const char *, s
17b0: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
17c0: 74 20 2c 20 69 6e 74 20 2a 29 3b 0a 73 74 61 74  t , int *);.stat
17d0: 69 63 20 69 6e 74 20 66 73 44 65 6c 65 74 65 28  ic int fsDelete(
17e0: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f  sqlite3_vfs*, co
17f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1800: 20 69 6e 74 20 73 79 6e 63 44 69 72 29 3b 0a 73   int syncDir);.s
1810: 74 61 74 69 63 20 69 6e 74 20 66 73 41 63 63 65  tatic int fsAcce
1820: 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  ss(sqlite3_vfs*,
1830: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1840: 6d 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69  me, int flags, i
1850: 6e 74 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  nt *);.static in
1860: 74 20 66 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  t fsFullPathname
1870: 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63  (sqlite3_vfs*, c
1880: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1890: 2c 20 69 6e 74 20 6e 4f 75 74 2c 63 68 61 72 20  , int nOut,char 
18a0: 2a 7a 4f 75 74 29 3b 0a 73 74 61 74 69 63 20 76  *zOut);.static v
18b0: 6f 69 64 20 2a 66 73 44 6c 4f 70 65 6e 28 73 71  oid *fsDlOpen(sq
18c0: 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73  lite3_vfs*, cons
18d0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
18e0: 65 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  e);.static void 
18f0: 66 73 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  fsDlError(sqlite
1900: 33 5f 76 66 73 2a 2c 20 69 6e 74 20 6e 42 79 74  3_vfs*, int nByt
1910: 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  e, char *zErrMsg
1920: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28  );.static void (
1930: 2a 66 73 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  *fsDlSym(sqlite3
1940: 5f 76 66 73 2a 2c 76 6f 69 64 2a 2c 20 63 6f 6e  _vfs*,void*, con
1950: 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c  st char *zSymbol
1960: 29 29 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63  ))(void);.static
1970: 20 76 6f 69 64 20 66 73 44 6c 43 6c 6f 73 65 28   void fsDlClose(
1980: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 76 6f  sqlite3_vfs*, vo
1990: 69 64 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  id*);.static int
19a0: 20 66 73 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71   fsRandomness(sq
19b0: 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74 20  lite3_vfs*, int 
19c0: 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 4f 75  nByte, char *zOu
19d0: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 66  t);.static int f
19e0: 73 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76  sSleep(sqlite3_v
19f0: 66 73 2a 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  fs*, int microse
1a00: 63 6f 6e 64 73 29 3b 0a 73 74 61 74 69 63 20 69  conds);.static i
1a10: 6e 74 20 66 73 43 75 72 72 65 6e 74 54 69 6d 65  nt fsCurrentTime
1a20: 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 64  (sqlite3_vfs*, d
1a30: 6f 75 62 6c 65 2a 29 3b 0a 0a 0a 74 79 70 65 64  ouble*);...typed
1a40: 65 66 20 73 74 72 75 63 74 20 66 73 5f 76 66 73  ef struct fs_vfs
1a50: 5f 74 20 66 73 5f 76 66 73 5f 74 3b 0a 73 74 72  _t fs_vfs_t;.str
1a60: 75 63 74 20 66 73 5f 76 66 73 5f 74 20 7b 0a 20  uct fs_vfs_t {. 
1a70: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 62 61 73   sqlite3_vfs bas
1a80: 65 3b 0a 20 20 66 73 5f 72 65 61 6c 5f 66 69 6c  e;.  fs_real_fil
1a90: 65 20 2a 70 46 69 6c 65 4c 69 73 74 3b 0a 20 20  e *pFileList;.  
1aa0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 50 61  sqlite3_vfs *pPa
1ab0: 72 65 6e 74 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63  rent;.};..static
1ac0: 20 66 73 5f 76 66 73 5f 74 20 66 73 5f 76 66 73   fs_vfs_t fs_vfs
1ad0: 20 3d 20 7b 0a 20 20 7b 0a 20 20 20 20 31 2c 20   = {.  {.    1, 
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
1b10: 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 30 2c 20 20  sion */.    0,  
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b40: 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46          /* szOsF
1b50: 69 6c 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ile */.    0,   
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68         /* mxPath
1b90: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  name */.    0,  
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
1bd0: 20 2a 2f 0a 20 20 20 20 46 53 5f 56 46 53 5f 4e   */.    FS_VFS_N
1be0: 41 4d 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  AME,            
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
1c10: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20  /* pAppData */. 
1c50: 20 20 20 66 73 4f 70 65 6e 2c 20 20 20 20 20 20     fsOpen,      
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c80: 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 66  * xOpen */.    f
1c90: 73 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20  sDelete,        
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
1cc0: 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 66 73 41  elete */.    fsA
1cd0: 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  ccess,          
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
1d00: 65 73 73 20 2a 2f 0a 20 20 20 20 66 73 46 75 6c  ess */.    fsFul
1d10: 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 20  lPathname,      
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50         /* xFullP
1d40: 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 66  athname */.    f
1d50: 73 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  sDlOpen,        
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
1d80: 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 66 73 44  lOpen */.    fsD
1d90: 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  lError,         
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45           /* xDlE
1dc0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 66 73 44 6c  rror */.    fsDl
1dd0: 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df0: 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
1e00: 6d 20 2a 2f 0a 20 20 20 20 66 73 44 6c 43 6c 6f  m */.    fsDlClo
1e10: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
1e40: 20 2a 2f 0a 20 20 20 20 66 73 52 61 6e 64 6f 6d   */.    fsRandom
1e50: 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  ness,           
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
1e80: 73 73 20 2a 2f 0a 20 20 20 20 66 73 53 6c 65 65  ss */.    fsSlee
1e90: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb0: 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20        /* xSleep 
1ec0: 2a 2f 0a 20 20 20 20 66 73 43 75 72 72 65 6e 74  */.    fsCurrent
1ed0: 54 69 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  Time            
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef0: 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
1f00: 6d 65 20 2a 2f 0a 20 20 7d 2c 20 0a 20 20 30 2c  me */.  }, .  0,
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
1f40: 46 69 6c 65 4c 69 73 74 20 2a 2f 0a 20 20 30 20  FileList */.  0 
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
1f80: 50 61 72 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 73 74  Parent */.};..st
1f90: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6f 5f  atic sqlite3_io_
1fa0: 6d 65 74 68 6f 64 73 20 66 73 5f 69 6f 5f 6d 65  methods fs_io_me
1fb0: 74 68 6f 64 73 20 3d 20 7b 0a 20 20 31 2c 20 20  thods = {.  1,  
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
1fe0: 72 73 69 6f 6e 20 2a 2f 0a 20 20 66 73 43 6c 6f  rsion */.  fsClo
1ff0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2000: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
2010: 73 65 20 2a 2f 0a 20 20 66 73 52 65 61 64 2c 20  se */.  fsRead, 
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2030: 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a        /* xRead *
2040: 2f 0a 20 20 66 73 57 72 69 74 65 2c 20 20 20 20  /.  fsWrite,    
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20    /* xWrite */. 
2070: 20 66 73 54 72 75 6e 63 61 74 65 2c 20 20 20 20   fsTruncate,    
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2090: 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20  * xTruncate */. 
20a0: 20 66 73 53 79 6e 63 2c 20 20 20 20 20 20 20 20   fsSync,        
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20c0: 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 66 73 46  * xSync */.  fsF
20d0: 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
20e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
20f0: 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 66 73 4c  ileSize */.  fsL
2100: 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
2120: 6f 63 6b 20 2a 2f 0a 20 20 66 73 55 6e 6c 6f 63  ock */.  fsUnloc
2130: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2140: 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
2150: 6b 20 2a 2f 0a 20 20 66 73 43 68 65 63 6b 52 65  k */.  fsCheckRe
2160: 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20  servedLock,     
2170: 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
2180: 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20  servedLock */.  
2190: 66 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  fsFileControl,  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21b0: 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f   xFileControl */
21c0: 0a 20 20 66 73 53 65 63 74 6f 72 53 69 7a 65 2c  .  fsSectorSize,
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20   /* xSectorSize 
21f0: 2a 2f 0a 20 20 66 73 44 65 76 69 63 65 43 68 61  */.  fsDeviceCha
2200: 72 61 63 74 65 72 69 73 74 69 63 73 20 20 20 20  racteristics    
2210: 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61     /* xDeviceCha
2220: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
2230: 7d 3b 0a 0a 0a 73 74 61 74 69 63 20 73 71 6c 69  };...static sqli
2240: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 74  te3_io_methods t
2250: 6d 70 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 3d 20  mp_io_methods = 
2260: 7b 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  {.  1,          
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
2290: 0a 20 20 74 6d 70 43 6c 6f 73 65 2c 20 20 20 20  .  tmpClose,    
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20   /* xClose */.  
22c0: 74 6d 70 52 65 61 64 2c 20 20 20 20 20 20 20 20  tmpRead,        
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22e0: 20 78 52 65 61 64 20 2a 2f 0a 20 20 74 6d 70 57   xRead */.  tmpW
22f0: 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
2300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
2310: 69 74 65 20 2a 2f 0a 20 20 74 6d 70 54 72 75 6e  ite */.  tmpTrun
2320: 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
2330: 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
2340: 61 74 65 20 2a 2f 0a 20 20 74 6d 70 53 79 6e 63  ate */.  tmpSync
2350: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2360: 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
2370: 2a 2f 0a 20 20 74 6d 70 46 69 6c 65 53 69 7a 65  */.  tmpFileSize
2380: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2390: 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20     /* xFileSize 
23a0: 2a 2f 0a 20 20 74 6d 70 4c 6f 63 6b 2c 20 20 20  */.  tmpLock,   
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20     /* xLock */. 
23d0: 20 74 6d 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   tmpUnlock,     
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23f0: 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 74  * xUnlock */.  t
2400: 6d 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  mpCheckReservedL
2410: 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ock,         /* 
2420: 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
2430: 63 6b 20 2a 2f 0a 20 20 74 6d 70 46 69 6c 65 43  ck */.  tmpFileC
2440: 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20  ontrol,         
2450: 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f        /* xFileCo
2460: 6e 74 72 6f 6c 20 2a 2f 0a 20 20 74 6d 70 53 65  ntrol */.  tmpSe
2470: 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20  ctorSize,       
2480: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
2490: 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 74 6d 70  torSize */.  tmp
24a0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
24b0: 73 74 69 63 73 20 20 20 20 20 20 2f 2a 20 78 44  stics      /* xD
24c0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
24d0: 74 69 63 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 55  tics */.};../* U
24e0: 73 65 66 75 6c 20 6d 61 63 72 6f 73 20 75 73 65  seful macros use
24f0: 64 20 69 6e 20 73 65 76 65 72 61 6c 20 70 6c 61  d in several pla
2500: 63 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  ces */.#define M
2510: 49 4e 28 78 2c 79 29 20 28 28 78 29 3c 28 79 29  IN(x,y) ((x)<(y)
2520: 3f 28 78 29 3a 28 79 29 29 0a 23 64 65 66 69 6e  ?(x):(y)).#defin
2530: 65 20 4d 41 58 28 78 2c 79 29 20 28 28 78 29 3e  e MAX(x,y) ((x)>
2540: 28 79 29 3f 28 78 29 3a 28 79 29 29 0a 0a 0a 2f  (y)?(x):(y)).../
2550: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 74 6d 70  *.** Close a tmp
2560: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
2570: 20 69 6e 74 20 74 6d 70 43 6c 6f 73 65 28 73 71   int tmpClose(sq
2580: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
2590: 65 29 7b 0a 20 20 74 6d 70 5f 66 69 6c 65 20 2a  e){.  tmp_file *
25a0: 70 54 6d 70 20 3d 20 28 74 6d 70 5f 66 69 6c 65  pTmp = (tmp_file
25b0: 20 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69   *)pFile;.  sqli
25c0: 74 65 33 5f 66 72 65 65 28 70 54 6d 70 2d 3e 7a  te3_free(pTmp->z
25d0: 41 6c 6c 6f 63 29 3b 0a 20 20 72 65 74 75 72 6e  Alloc);.  return
25e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
25f0: 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
2600: 72 6f 6d 20 61 20 74 6d 70 2d 66 69 6c 65 2e 0a  rom a tmp-file..
2610: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 6d  */.static int tm
2620: 70 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33  pRead(.  sqlite3
2630: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20  _file *pFile, . 
2640: 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20   void *zBuf, .  
2650: 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c  int iAmt, .  sql
2660: 69 74 65 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a  ite_int64 iOfst.
2670: 29 7b 0a 20 20 74 6d 70 5f 66 69 6c 65 20 2a 70  ){.  tmp_file *p
2680: 54 6d 70 20 3d 20 28 74 6d 70 5f 66 69 6c 65 20  Tmp = (tmp_file 
2690: 2a 29 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 28  *)pFile;.  if( (
26a0: 69 41 6d 74 2b 69 4f 66 73 74 29 3e 70 54 6d 70  iAmt+iOfst)>pTmp
26b0: 2d 3e 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  ->nSize ){.    r
26c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
26d0: 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
26e0: 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 42 75 66   }.  memcpy(zBuf
26f0: 2c 20 26 70 54 6d 70 2d 3e 7a 41 6c 6c 6f 63 5b  , &pTmp->zAlloc[
2700: 69 4f 66 73 74 5d 2c 20 69 41 6d 74 29 3b 0a 20  iOfst], iAmt);. 
2710: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2720: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  K;.}../*.** Writ
2730: 65 20 64 61 74 61 20 74 6f 20 61 20 74 6d 70 2d  e data to a tmp-
2740: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
2750: 69 6e 74 20 74 6d 70 57 72 69 74 65 28 0a 20 20  int tmpWrite(.  
2760: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
2770: 69 6c 65 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  ile, .  const vo
2780: 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74  id *zBuf, .  int
2790: 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65   iAmt, .  sqlite
27a0: 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a  _int64 iOfst.){.
27b0: 20 20 74 6d 70 5f 66 69 6c 65 20 2a 70 54 6d 70    tmp_file *pTmp
27c0: 20 3d 20 28 74 6d 70 5f 66 69 6c 65 20 2a 29 70   = (tmp_file *)p
27d0: 46 69 6c 65 3b 0a 20 20 69 66 28 20 28 69 41 6d  File;.  if( (iAm
27e0: 74 2b 69 4f 66 73 74 29 3e 70 54 6d 70 2d 3e 6e  t+iOfst)>pTmp->n
27f0: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74  Alloc ){.    int
2800: 20 6e 4e 65 77 20 3d 20 32 2a 28 69 41 6d 74 2b   nNew = 2*(iAmt+
2810: 69 4f 66 73 74 2b 70 54 6d 70 2d 3e 6e 41 6c 6c  iOfst+pTmp->nAll
2820: 6f 63 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  oc);.    char *z
2830: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
2840: 61 6c 6c 6f 63 28 70 54 6d 70 2d 3e 7a 41 6c 6c  alloc(pTmp->zAll
2850: 6f 63 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69  oc, nNew);.    i
2860: 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20 20 20 20  f( !zNew ){.    
2870: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2880: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
2890: 20 70 54 6d 70 2d 3e 7a 41 6c 6c 6f 63 20 3d 20   pTmp->zAlloc = 
28a0: 7a 4e 65 77 3b 0a 20 20 20 20 70 54 6d 70 2d 3e  zNew;.    pTmp->
28b0: 6e 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20  nAlloc = nNew;. 
28c0: 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70 54 6d   }.  memcpy(&pTm
28d0: 70 2d 3e 7a 41 6c 6c 6f 63 5b 69 4f 66 73 74 5d  p->zAlloc[iOfst]
28e0: 2c 20 7a 42 75 66 2c 20 69 41 6d 74 29 3b 0a 20  , zBuf, iAmt);. 
28f0: 20 70 54 6d 70 2d 3e 6e 53 69 7a 65 20 3d 20 4d   pTmp->nSize = M
2900: 41 58 28 70 54 6d 70 2d 3e 6e 53 69 7a 65 2c 20  AX(pTmp->nSize, 
2910: 69 4f 66 73 74 2b 69 41 6d 74 29 3b 0a 20 20 72  iOfst+iAmt);.  r
2920: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2930: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
2940: 74 65 20 61 20 74 6d 70 2d 66 69 6c 65 2e 0a 2a  te a tmp-file..*
2950: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 6d 70  /.static int tmp
2960: 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33  Truncate(sqlite3
2970: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71  _file *pFile, sq
2980: 6c 69 74 65 5f 69 6e 74 36 34 20 73 69 7a 65 29  lite_int64 size)
2990: 7b 0a 20 20 74 6d 70 5f 66 69 6c 65 20 2a 70 54  {.  tmp_file *pT
29a0: 6d 70 20 3d 20 28 74 6d 70 5f 66 69 6c 65 20 2a  mp = (tmp_file *
29b0: 29 70 46 69 6c 65 3b 0a 20 20 70 54 6d 70 2d 3e  )pFile;.  pTmp->
29c0: 6e 53 69 7a 65 20 3d 20 4d 49 4e 28 70 54 6d 70  nSize = MIN(pTmp
29d0: 2d 3e 6e 53 69 7a 65 2c 20 73 69 7a 65 29 3b 0a  ->nSize, size);.
29e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
2a00: 63 20 61 20 74 6d 70 2d 66 69 6c 65 2e 0a 2a 2f  c a tmp-file..*/
2a10: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 6d 70 53  .static int tmpS
2a20: 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ync(sqlite3_file
2a30: 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61   *pFile, int fla
2a40: 67 73 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  gs){.  return SQ
2a50: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2a60: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
2a70: 72 65 6e 74 20 66 69 6c 65 2d 73 69 7a 65 20 6f  rent file-size o
2a80: 66 20 61 20 74 6d 70 2d 66 69 6c 65 2e 0a 2a 2f  f a tmp-file..*/
2a90: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 6d 70 46  .static int tmpF
2aa0: 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
2ab0: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c  file *pFile, sql
2ac0: 69 74 65 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65  ite_int64 *pSize
2ad0: 29 7b 0a 20 20 74 6d 70 5f 66 69 6c 65 20 2a 70  ){.  tmp_file *p
2ae0: 54 6d 70 20 3d 20 28 74 6d 70 5f 66 69 6c 65 20  Tmp = (tmp_file 
2af0: 2a 29 70 46 69 6c 65 3b 0a 20 20 2a 70 53 69 7a  *)pFile;.  *pSiz
2b00: 65 20 3d 20 70 54 6d 70 2d 3e 6e 53 69 7a 65 3b  e = pTmp->nSize;
2b10: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2b20: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  _OK;.}../*.** Lo
2b30: 63 6b 20 61 20 74 6d 70 2d 66 69 6c 65 2e 0a 2a  ck a tmp-file..*
2b40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 6d 70  /.static int tmp
2b50: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
2b60: 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65 4c  e *pFile, int eL
2b70: 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 53  ock){.  return S
2b80: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2b90: 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20 74 6d 70 2d  ** Unlock a tmp-
2ba0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
2bb0: 69 6e 74 20 74 6d 70 55 6e 6c 6f 63 6b 28 73 71  int tmpUnlock(sq
2bc0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
2bd0: 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  e, int eLock){. 
2be0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2bf0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  K;.}../*.** Chec
2c00: 6b 20 69 66 20 61 6e 6f 74 68 65 72 20 66 69 6c  k if another fil
2c10: 65 2d 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61  e-handle holds a
2c20: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
2c30: 6e 20 61 20 74 6d 70 2d 66 69 6c 65 2e 0a 2a 2f  n a tmp-file..*/
2c40: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 6d 70 43  .static int tmpC
2c50: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2c60: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
2c70: 46 69 6c 65 2c 20 69 6e 74 20 2a 70 52 65 73 4f  File, int *pResO
2c80: 75 74 29 7b 0a 20 20 2a 70 52 65 73 4f 75 74 20  ut){.  *pResOut 
2c90: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
2ca0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2cb0: 2a 20 46 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 6d  * File control m
2cc0: 65 74 68 6f 64 2e 20 46 6f 72 20 63 75 73 74 6f  ethod. For custo
2cd0: 6d 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20  m operations on 
2ce0: 61 20 74 6d 70 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  a tmp-file..*/.s
2cf0: 74 61 74 69 63 20 69 6e 74 20 74 6d 70 46 69 6c  tatic int tmpFil
2d00: 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
2d10: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  _file *pFile, in
2d20: 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
2d30: 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ){.  return SQLI
2d40: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2d50: 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f  Return the secto
2d60: 72 2d 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  r-size in bytes 
2d70: 66 6f 72 20 61 20 74 6d 70 2d 66 69 6c 65 2e 0a  for a tmp-file..
2d80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 6d  */.static int tm
2d90: 70 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  pSectorSize(sqli
2da0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
2db0: 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  {.  return 0;.}.
2dc0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2dd0: 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  e device charact
2de0: 65 72 69 73 74 69 63 20 66 6c 61 67 73 20 73 75  eristic flags su
2df0: 70 70 6f 72 74 65 64 20 62 79 20 61 20 74 6d 70  pported by a tmp
2e00: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
2e10: 20 69 6e 74 20 74 6d 70 44 65 76 69 63 65 43 68   int tmpDeviceCh
2e20: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
2e30: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
2e40: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  e){.  return 0;.
2e50: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
2e60: 6e 20 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  n fs-file..*/.st
2e70: 61 74 69 63 20 69 6e 74 20 66 73 43 6c 6f 73 65  atic int fsClose
2e80: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
2e90: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  File){.  int rc 
2ea0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66  = SQLITE_OK;.  f
2eb0: 73 5f 66 69 6c 65 20 2a 70 20 3d 20 28 66 73 5f  s_file *p = (fs_
2ec0: 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  file *)pFile;.  
2ed0: 66 73 5f 72 65 61 6c 5f 66 69 6c 65 20 2a 70 52  fs_real_file *pR
2ee0: 65 61 6c 20 3d 20 70 2d 3e 70 52 65 61 6c 3b 0a  eal = p->pReal;.
2ef0: 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20  .  /* Decrement 
2f00: 74 68 65 20 72 65 61 6c 5f 66 69 6c 65 20 72 65  the real_file re
2f10: 66 2d 63 6f 75 6e 74 2e 20 2a 2f 0a 20 20 70 52  f-count. */.  pR
2f20: 65 61 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 61  eal->nRef--;.  a
2f30: 73 73 65 72 74 28 70 52 65 61 6c 2d 3e 6e 52 65  ssert(pReal->nRe
2f40: 66 3e 3d 30 29 3b 0a 0a 20 20 2f 2a 20 57 68 65  f>=0);..  /* Whe
2f50: 6e 20 74 68 65 20 72 65 66 2d 63 6f 75 6e 74 20  n the ref-count 
2f60: 72 65 61 63 68 65 73 20 30 2c 20 64 65 73 74 72  reaches 0, destr
2f70: 6f 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65  oy the structure
2f80: 20 2a 2f 0a 20 20 69 66 28 20 70 52 65 61 6c 2d   */.  if( pReal-
2f90: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
2fa0: 2a 70 52 65 61 6c 2d 3e 70 70 54 68 69 73 20 3d  *pReal->ppThis =
2fb0: 20 70 52 65 61 6c 2d 3e 70 4e 65 78 74 3b 0a 20   pReal->pNext;. 
2fc0: 20 20 20 69 66 28 20 70 52 65 61 6c 2d 3e 70 4e     if( pReal->pN
2fd0: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 52 65  ext ){.      pRe
2fe0: 61 6c 2d 3e 70 4e 65 78 74 2d 3e 70 70 54 68 69  al->pNext->ppThi
2ff0: 73 20 3d 20 70 52 65 61 6c 2d 3e 70 70 54 68 69  s = pReal->ppThi
3000: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  s;.    }.    rc 
3010: 3d 20 70 52 65 61 6c 2d 3e 70 46 69 6c 65 2d 3e  = pReal->pFile->
3020: 70 4d 65 74 68 6f 64 73 2d 3e 78 43 6c 6f 73 65  pMethods->xClose
3030: 28 70 52 65 61 6c 2d 3e 70 46 69 6c 65 29 3b 0a  (pReal->pFile);.
3040: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3050: 28 70 52 65 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20  (pReal);.  }..  
3060: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
3070: 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
3080: 6f 6d 20 61 6e 20 66 73 2d 66 69 6c 65 2e 0a 2a  om an fs-file..*
3090: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 73 52  /.static int fsR
30a0: 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ead(.  sqlite3_f
30b0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 76  ile *pFile, .  v
30c0: 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e  oid *zBuf, .  in
30d0: 74 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74  t iAmt, .  sqlit
30e0: 65 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b  e_int64 iOfst.){
30f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
3100: 54 45 5f 4f 4b 3b 0a 20 20 66 73 5f 66 69 6c 65  TE_OK;.  fs_file
3110: 20 2a 70 20 3d 20 28 66 73 5f 66 69 6c 65 20 2a   *p = (fs_file *
3120: 29 70 46 69 6c 65 3b 0a 20 20 66 73 5f 72 65 61  )pFile;.  fs_rea
3130: 6c 5f 66 69 6c 65 20 2a 70 52 65 61 6c 20 3d 20  l_file *pReal = 
3140: 70 2d 3e 70 52 65 61 6c 3b 0a 20 20 73 71 6c 69  p->pReal;.  sqli
3150: 74 65 33 5f 66 69 6c 65 20 2a 70 46 20 3d 20 70  te3_file *pF = p
3160: 52 65 61 6c 2d 3e 70 46 69 6c 65 3b 0a 0a 20 20  Real->pFile;..  
3170: 69 66 28 20 28 70 2d 3e 65 54 79 70 65 3d 3d 44  if( (p->eType==D
3180: 41 54 41 42 41 53 45 5f 46 49 4c 45 20 26 26 20  ATABASE_FILE && 
3190: 28 69 41 6d 74 2b 69 4f 66 73 74 29 3e 70 52 65  (iAmt+iOfst)>pRe
31a0: 61 6c 2d 3e 6e 44 61 74 61 62 61 73 65 29 0a 20  al->nDatabase). 
31b0: 20 20 7c 7c 20 28 70 2d 3e 65 54 79 70 65 3d 3d    || (p->eType==
31c0: 4a 4f 55 52 4e 41 4c 5f 46 49 4c 45 20 26 26 20  JOURNAL_FILE && 
31d0: 28 69 41 6d 74 2b 69 4f 66 73 74 29 3e 70 52 65  (iAmt+iOfst)>pRe
31e0: 61 6c 2d 3e 6e 4a 6f 75 72 6e 61 6c 29 0a 20 20  al->nJournal).  
31f0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
3200: 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
3210: 45 41 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  EAD;.  }else if(
3220: 20 70 2d 3e 65 54 79 70 65 3d 3d 44 41 54 41 42   p->eType==DATAB
3230: 41 53 45 5f 46 49 4c 45 20 29 7b 0a 20 20 20 20  ASE_FILE ){.    
3240: 72 63 20 3d 20 70 46 2d 3e 70 4d 65 74 68 6f 64  rc = pF->pMethod
3250: 73 2d 3e 78 52 65 61 64 28 70 46 2c 20 7a 42 75  s->xRead(pF, zBu
3260: 66 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 2b 42  f, iAmt, iOfst+B
3270: 4c 4f 43 4b 53 49 5a 45 29 3b 0a 20 20 7d 65 6c  LOCKSIZE);.  }el
3280: 73 65 7b 0a 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  se{.    /* Journ
3290: 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
32a0: 69 6e 74 20 69 52 65 6d 20 3d 20 69 41 6d 74 3b  int iRem = iAmt;
32b0: 0a 20 20 20 20 69 6e 74 20 69 42 75 66 20 3d 20  .    int iBuf = 
32c0: 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 20 3d 20  0;.    int ii = 
32d0: 69 4f 66 73 74 3b 0a 20 20 20 20 77 68 69 6c 65  iOfst;.    while
32e0: 28 20 69 52 65 6d 3e 30 20 26 26 20 72 63 3d 3d  ( iRem>0 && rc==
32f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3300: 20 20 20 69 6e 74 20 69 52 65 61 6c 4f 66 66 20     int iRealOff 
3310: 3d 20 70 52 65 61 6c 2d 3e 6e 42 6c 6f 62 20 2d  = pReal->nBlob -
3320: 20 42 4c 4f 43 4b 53 49 5a 45 2a 28 28 69 69 2f   BLOCKSIZE*((ii/
3330: 42 4c 4f 43 4b 53 49 5a 45 29 2b 31 29 20 2b 20  BLOCKSIZE)+1) + 
3340: 69 69 25 42 4c 4f 43 4b 53 49 5a 45 3b 0a 20 20  ii%BLOCKSIZE;.  
3350: 20 20 20 20 69 6e 74 20 69 52 65 61 6c 41 6d 74      int iRealAmt
3360: 20 3d 20 4d 49 4e 28 69 52 65 6d 2c 20 42 4c 4f   = MIN(iRem, BLO
3370: 43 4b 53 49 5a 45 20 2d 20 28 69 52 65 61 6c 4f  CKSIZE - (iRealO
3380: 66 66 25 42 4c 4f 43 4b 53 49 5a 45 29 29 3b 0a  ff%BLOCKSIZE));.
3390: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 46 2d 3e  .      rc = pF->
33a0: 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61 64 28  pMethods->xRead(
33b0: 70 46 2c 20 26 28 28 63 68 61 72 20 2a 29 7a 42  pF, &((char *)zB
33c0: 75 66 29 5b 69 42 75 66 5d 2c 20 69 52 65 61 6c  uf)[iBuf], iReal
33d0: 41 6d 74 2c 20 69 52 65 61 6c 4f 66 66 29 3b 0a  Amt, iRealOff);.
33e0: 20 20 20 20 20 20 69 69 20 2b 3d 20 69 52 65 61        ii += iRea
33f0: 6c 41 6d 74 3b 0a 20 20 20 20 20 20 69 42 75 66  lAmt;.      iBuf
3400: 20 2b 3d 20 69 52 65 61 6c 41 6d 74 3b 0a 20 20   += iRealAmt;.  
3410: 20 20 20 20 69 52 65 6d 20 2d 3d 20 69 52 65 61      iRem -= iRea
3420: 6c 41 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lAmt;.    }.  }.
3430: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3440: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74  ./*.** Write dat
3450: 61 20 74 6f 20 61 6e 20 66 73 2d 66 69 6c 65 2e  a to an fs-file.
3460: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
3470: 73 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  sWrite(.  sqlite
3480: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a  3_file *pFile, .
3490: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42    const void *zB
34a0: 75 66 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74 2c  uf, .  int iAmt,
34b0: 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34   .  sqlite_int64
34c0: 20 69 4f 66 73 74 0a 29 7b 0a 20 20 69 6e 74 20   iOfst.){.  int 
34d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
34e0: 20 20 66 73 5f 66 69 6c 65 20 2a 70 20 3d 20 28    fs_file *p = (
34f0: 66 73 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b  fs_file *)pFile;
3500: 0a 20 20 66 73 5f 72 65 61 6c 5f 66 69 6c 65 20  .  fs_real_file 
3510: 2a 70 52 65 61 6c 20 3d 20 70 2d 3e 70 52 65 61  *pReal = p->pRea
3520: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  l;.  sqlite3_fil
3530: 65 20 2a 70 46 20 3d 20 70 52 65 61 6c 2d 3e 70  e *pF = pReal->p
3540: 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  File;..  if( p->
3550: 65 54 79 70 65 3d 3d 44 41 54 41 42 41 53 45 5f  eType==DATABASE_
3560: 46 49 4c 45 20 29 7b 0a 20 20 20 20 69 66 28 20  FILE ){.    if( 
3570: 28 69 41 6d 74 2b 69 4f 66 73 74 2b 42 4c 4f 43  (iAmt+iOfst+BLOC
3580: 4b 53 49 5a 45 29 3e 28 70 52 65 61 6c 2d 3e 6e  KSIZE)>(pReal->n
3590: 42 6c 6f 62 2d 70 52 65 61 6c 2d 3e 6e 4a 6f 75  Blob-pReal->nJou
35a0: 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 72  rnal) ){.      r
35b0: 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
35c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
35d0: 20 20 72 63 20 3d 20 70 46 2d 3e 70 4d 65 74 68    rc = pF->pMeth
35e0: 6f 64 73 2d 3e 78 57 72 69 74 65 28 70 46 2c 20  ods->xWrite(pF, 
35f0: 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69 4f 66 73  zBuf, iAmt, iOfs
3600: 74 2b 42 4c 4f 43 4b 53 49 5a 45 29 3b 0a 20 20  t+BLOCKSIZE);.  
3610: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
3620: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
3630: 20 70 52 65 61 6c 2d 3e 6e 44 61 74 61 62 61 73   pReal->nDatabas
3640: 65 20 3d 20 4d 41 58 28 70 52 65 61 6c 2d 3e 6e  e = MAX(pReal->n
3650: 44 61 74 61 62 61 73 65 2c 20 69 41 6d 74 2b 69  Database, iAmt+i
3660: 4f 66 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Ofst);.      }. 
3670: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
3680: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
3690: 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52  e. */.    int iR
36a0: 65 6d 20 3d 20 69 41 6d 74 3b 0a 20 20 20 20 69  em = iAmt;.    i
36b0: 6e 74 20 69 42 75 66 20 3d 20 30 3b 0a 20 20 20  nt iBuf = 0;.   
36c0: 20 69 6e 74 20 69 69 20 3d 20 69 4f 66 73 74 3b   int ii = iOfst;
36d0: 0a 20 20 20 20 77 68 69 6c 65 28 20 69 52 65 6d  .    while( iRem
36e0: 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  >0 && rc==SQLITE
36f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
3700: 20 69 52 65 61 6c 4f 66 66 20 3d 20 70 52 65 61   iRealOff = pRea
3710: 6c 2d 3e 6e 42 6c 6f 62 20 2d 20 42 4c 4f 43 4b  l->nBlob - BLOCK
3720: 53 49 5a 45 2a 28 28 69 69 2f 42 4c 4f 43 4b 53  SIZE*((ii/BLOCKS
3730: 49 5a 45 29 2b 31 29 20 2b 20 69 69 25 42 4c 4f  IZE)+1) + ii%BLO
3740: 43 4b 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 6e  CKSIZE;.      in
3750: 74 20 69 52 65 61 6c 41 6d 74 20 3d 20 4d 49 4e  t iRealAmt = MIN
3760: 28 69 52 65 6d 2c 20 42 4c 4f 43 4b 53 49 5a 45  (iRem, BLOCKSIZE
3770: 20 2d 20 28 69 52 65 61 6c 4f 66 66 25 42 4c 4f   - (iRealOff%BLO
3780: 43 4b 53 49 5a 45 29 29 3b 0a 0a 20 20 20 20 20  CKSIZE));..     
3790: 20 69 66 28 20 69 52 65 61 6c 4f 66 66 3c 28 70   if( iRealOff<(p
37a0: 52 65 61 6c 2d 3e 6e 44 61 74 61 62 61 73 65 2b  Real->nDatabase+
37b0: 42 4c 4f 43 4b 53 49 5a 45 29 20 29 7b 0a 20 20  BLOCKSIZE) ){.  
37c0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
37d0: 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65  E_FULL;.      }e
37e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
37f0: 3d 20 70 46 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  = pF->pMethods->
3800: 78 57 72 69 74 65 28 70 46 2c 20 26 28 28 63 68  xWrite(pF, &((ch
3810: 61 72 20 2a 29 7a 42 75 66 29 5b 69 42 75 66 5d  ar *)zBuf)[iBuf]
3820: 2c 20 69 52 65 61 6c 41 6d 74 2c 69 52 65 61 6c  , iRealAmt,iReal
3830: 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 69  Off);.        ii
3840: 20 2b 3d 20 69 52 65 61 6c 41 6d 74 3b 0a 20 20   += iRealAmt;.  
3850: 20 20 20 20 20 20 69 42 75 66 20 2b 3d 20 69 52        iBuf += iR
3860: 65 61 6c 41 6d 74 3b 0a 20 20 20 20 20 20 20 20  ealAmt;.        
3870: 69 52 65 6d 20 2d 3d 20 69 52 65 61 6c 41 6d 74  iRem -= iRealAmt
3880: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3890: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
38a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
38b0: 52 65 61 6c 2d 3e 6e 4a 6f 75 72 6e 61 6c 20 3d  Real->nJournal =
38c0: 20 4d 41 58 28 70 52 65 61 6c 2d 3e 6e 4a 6f 75   MAX(pReal->nJou
38d0: 72 6e 61 6c 2c 20 69 41 6d 74 2b 69 4f 66 73 74  rnal, iAmt+iOfst
38e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
38f0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
3900: 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20  .** Truncate an 
3910: 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
3920: 69 63 20 69 6e 74 20 66 73 54 72 75 6e 63 61 74  ic int fsTruncat
3930: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
3940: 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e  pFile, sqlite_in
3950: 74 36 34 20 73 69 7a 65 29 7b 0a 20 20 66 73 5f  t64 size){.  fs_
3960: 66 69 6c 65 20 2a 70 20 3d 20 28 66 73 5f 66 69  file *p = (fs_fi
3970: 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 66 73  le *)pFile;.  fs
3980: 5f 72 65 61 6c 5f 66 69 6c 65 20 2a 70 52 65 61  _real_file *pRea
3990: 6c 20 3d 20 70 2d 3e 70 52 65 61 6c 3b 0a 20 20  l = p->pReal;.  
39a0: 69 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d 44 41  if( p->eType==DA
39b0: 54 41 42 41 53 45 5f 46 49 4c 45 20 29 7b 0a 20  TABASE_FILE ){. 
39c0: 20 20 20 70 52 65 61 6c 2d 3e 6e 44 61 74 61 62     pReal->nDatab
39d0: 61 73 65 20 3d 20 4d 49 4e 28 70 52 65 61 6c 2d  ase = MIN(pReal-
39e0: 3e 6e 44 61 74 61 62 61 73 65 2c 20 73 69 7a 65  >nDatabase, size
39f0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3a00: 70 52 65 61 6c 2d 3e 6e 4a 6f 75 72 6e 61 6c 20  pReal->nJournal 
3a10: 3d 20 4d 49 4e 28 70 52 65 61 6c 2d 3e 6e 4a 6f  = MIN(pReal->nJo
3a20: 75 72 6e 61 6c 2c 20 73 69 7a 65 29 3b 0a 20 20  urnal, size);.  
3a30: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
3a40: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
3a50: 79 6e 63 20 61 6e 20 66 73 2d 66 69 6c 65 2e 0a  ync an fs-file..
3a60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 73  */.static int fs
3a70: 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c  Sync(sqlite3_fil
3a80: 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 66 6c  e *pFile, int fl
3a90: 61 67 73 29 7b 0a 20 20 66 73 5f 66 69 6c 65 20  ags){.  fs_file 
3aa0: 2a 70 20 3d 20 28 66 73 5f 66 69 6c 65 20 2a 29  *p = (fs_file *)
3ab0: 70 46 69 6c 65 3b 0a 20 20 66 73 5f 72 65 61 6c  pFile;.  fs_real
3ac0: 5f 66 69 6c 65 20 2a 70 52 65 61 6c 20 3d 20 70  _file *pReal = p
3ad0: 2d 3e 70 52 65 61 6c 3b 0a 20 20 73 71 6c 69 74  ->pReal;.  sqlit
3ae0: 65 33 5f 66 69 6c 65 20 2a 70 52 65 61 6c 46 69  e3_file *pRealFi
3af0: 6c 65 20 3d 20 70 52 65 61 6c 2d 3e 70 46 69 6c  le = pReal->pFil
3b00: 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
3b10: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
3b20: 70 2d 3e 65 54 79 70 65 3d 3d 44 41 54 41 42 41  p->eType==DATABA
3b30: 53 45 5f 46 49 4c 45 20 29 7b 0a 20 20 20 20 75  SE_FILE ){.    u
3b40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 53 69  nsigned char zSi
3b50: 7a 65 5b 34 5d 3b 0a 20 20 20 20 7a 53 69 7a 65  ze[4];.    zSize
3b60: 5b 30 5d 20 3d 20 28 70 52 65 61 6c 2d 3e 6e 44  [0] = (pReal->nD
3b70: 61 74 61 62 61 73 65 26 30 78 46 46 30 30 30 30  atabase&0xFF0000
3b80: 30 30 29 3e 3e 32 34 3b 0a 20 20 20 20 7a 53 69  00)>>24;.    zSi
3b90: 7a 65 5b 31 5d 20 3d 20 28 70 52 65 61 6c 2d 3e  ze[1] = (pReal->
3ba0: 6e 44 61 74 61 62 61 73 65 26 30 78 30 30 46 46  nDatabase&0x00FF
3bb0: 30 30 30 30 29 3e 3e 31 36 3b 0a 20 20 20 20 7a  0000)>>16;.    z
3bc0: 53 69 7a 65 5b 32 5d 20 3d 20 28 70 52 65 61 6c  Size[2] = (pReal
3bd0: 2d 3e 6e 44 61 74 61 62 61 73 65 26 30 78 30 30  ->nDatabase&0x00
3be0: 30 30 46 46 30 30 29 3e 3e 38 3b 0a 20 20 20 20  00FF00)>>8;.    
3bf0: 7a 53 69 7a 65 5b 33 5d 20 3d 20 28 70 52 65 61  zSize[3] = (pRea
3c00: 6c 2d 3e 6e 44 61 74 61 62 61 73 65 26 30 78 30  l->nDatabase&0x0
3c10: 30 30 30 30 30 46 46 29 3b 0a 20 20 20 20 72 63  00000FF);.    rc
3c20: 20 3d 20 70 52 65 61 6c 46 69 6c 65 2d 3e 70 4d   = pRealFile->pM
3c30: 65 74 68 6f 64 73 2d 3e 78 57 72 69 74 65 28 70  ethods->xWrite(p
3c40: 52 65 61 6c 46 69 6c 65 2c 20 7a 53 69 7a 65 2c  RealFile, zSize,
3c50: 20 34 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   4, 0);.  }.  if
3c60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
3c70: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 52 65 61  ){.    rc = pRea
3c80: 6c 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d  lFile->pMethods-
3c90: 3e 78 53 79 6e 63 28 70 52 65 61 6c 46 69 6c 65  >xSync(pRealFile
3ca0: 2c 20 66 6c 61 67 73 26 28 7e 53 51 4c 49 54 45  , flags&(~SQLITE
3cb0: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 29  _SYNC_DATAONLY))
3cc0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
3cd0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
3ce0: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
3cf0: 66 69 6c 65 2d 73 69 7a 65 20 6f 66 20 61 6e 20  file-size of an 
3d00: 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
3d10: 69 63 20 69 6e 74 20 66 73 46 69 6c 65 53 69 7a  ic int fsFileSiz
3d20: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
3d30: 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e  pFile, sqlite_in
3d40: 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 66  t64 *pSize){.  f
3d50: 73 5f 66 69 6c 65 20 2a 70 20 3d 20 28 66 73 5f  s_file *p = (fs_
3d60: 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  file *)pFile;.  
3d70: 66 73 5f 72 65 61 6c 5f 66 69 6c 65 20 2a 70 52  fs_real_file *pR
3d80: 65 61 6c 20 3d 20 70 2d 3e 70 52 65 61 6c 3b 0a  eal = p->pReal;.
3d90: 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d    if( p->eType==
3da0: 44 41 54 41 42 41 53 45 5f 46 49 4c 45 20 29 7b  DATABASE_FILE ){
3db0: 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 52  .    *pSize = pR
3dc0: 65 61 6c 2d 3e 6e 44 61 74 61 62 61 73 65 3b 0a  eal->nDatabase;.
3dd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 53    }else{.    *pS
3de0: 69 7a 65 20 3d 20 70 52 65 61 6c 2d 3e 6e 4a 6f  ize = pReal->nJo
3df0: 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74  urnal;.  }.  ret
3e00: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
3e10: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 6e 20  ../*.** Lock an 
3e20: 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
3e30: 69 63 20 69 6e 74 20 66 73 4c 6f 63 6b 28 73 71  ic int fsLock(sq
3e40: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
3e50: 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  e, int eLock){. 
3e60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3e70: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  K;.}../*.** Unlo
3e80: 63 6b 20 61 6e 20 66 73 2d 66 69 6c 65 2e 0a 2a  ck an fs-file..*
3e90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 73 55  /.static int fsU
3ea0: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
3eb0: 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65  le *pFile, int e
3ec0: 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20  Lock){.  return 
3ed0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
3ee0: 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 6f  .** Check if ano
3ef0: 74 68 65 72 20 66 69 6c 65 2d 68 61 6e 64 6c 65  ther file-handle
3f00: 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
3f10: 44 20 6c 6f 63 6b 20 6f 6e 20 61 6e 20 66 73 2d  D lock on an fs-
3f20: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
3f30: 69 6e 74 20 66 73 43 68 65 63 6b 52 65 73 65 72  int fsCheckReser
3f40: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
3f50: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
3f60: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 2a 70   *pResOut){.  *p
3f70: 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65  ResOut = 0;.  re
3f80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3f90: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 65 20 63 6f  }../*.** File co
3fa0: 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 2e 20 46 6f  ntrol method. Fo
3fb0: 72 20 63 75 73 74 6f 6d 20 6f 70 65 72 61 74 69  r custom operati
3fc0: 6f 6e 73 20 6f 6e 20 61 6e 20 66 73 2d 66 69 6c  ons on an fs-fil
3fd0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
3fe0: 20 66 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73   fsFileControl(s
3ff0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
4000: 6c 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  le, int op, void
4010: 20 2a 70 41 72 67 29 7b 0a 20 20 72 65 74 75 72   *pArg){.  retur
4020: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4030: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4040: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20   sector-size in 
4050: 62 79 74 65 73 20 66 6f 72 20 61 6e 20 66 73 2d  bytes for an fs-
4060: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
4070: 69 6e 74 20 66 73 53 65 63 74 6f 72 53 69 7a 65  int fsSectorSize
4080: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
4090: 46 69 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  File){.  return 
40a0: 42 4c 4f 43 4b 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  BLOCKSIZE;.}../*
40b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
40c0: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
40d0: 73 74 69 63 20 66 6c 61 67 73 20 73 75 70 70 6f  stic flags suppo
40e0: 72 74 65 64 20 62 79 20 61 6e 20 66 73 2d 66 69  rted by an fs-fi
40f0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
4100: 74 20 66 73 44 65 76 69 63 65 43 68 61 72 61 63  t fsDeviceCharac
4110: 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
4120: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
4130: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4140: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e 20 66 73 20  *.** Open an fs 
4150: 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  file handle..*/.
4160: 73 74 61 74 69 63 20 69 6e 74 20 66 73 4f 70 65  static int fsOpe
4170: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
4180: 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20   *pVfs,.  const 
4190: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 73  char *zName,.  s
41a0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
41b0: 6c 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c  le,.  int flags,
41c0: 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67  .  int *pOutFlag
41d0: 73 0a 29 7b 0a 20 20 66 73 5f 76 66 73 5f 74 20  s.){.  fs_vfs_t 
41e0: 2a 70 46 73 56 66 73 20 3d 20 28 66 73 5f 76 66  *pFsVfs = (fs_vf
41f0: 73 5f 74 20 2a 29 70 56 66 73 3b 0a 20 20 66 73  s_t *)pVfs;.  fs
4200: 5f 66 69 6c 65 20 2a 70 20 3d 20 28 66 73 5f 66  _file *p = (fs_f
4210: 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 66  ile *)pFile;.  f
4220: 73 5f 72 65 61 6c 5f 66 69 6c 65 20 2a 70 52 65  s_real_file *pRe
4230: 61 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 65 54  al = 0;.  int eT
4240: 79 70 65 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  ype;.  int nName
4250: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
4260: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 30  ITE_OK;..  if( 0
4270: 3d 3d 28 66 6c 61 67 73 26 28 53 51 4c 49 54 45  ==(flags&(SQLITE
4280: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51  _OPEN_MAIN_DB|SQ
4290: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
42a0: 4f 55 52 4e 41 4c 29 29 20 29 7b 0a 20 20 20 20  OURNAL)) ){.    
42b0: 74 6d 70 5f 66 69 6c 65 20 2a 70 20 3d 20 28 74  tmp_file *p = (t
42c0: 6d 70 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b  mp_file *)pFile;
42d0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  .    memset(p, 0
42e0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
42f0: 20 20 20 70 2d 3e 62 61 73 65 2e 70 4d 65 74 68     p->base.pMeth
4300: 6f 64 73 20 3d 20 26 74 6d 70 5f 69 6f 5f 6d 65  ods = &tmp_io_me
4310: 74 68 6f 64 73 3b 0a 20 20 20 20 72 65 74 75 72  thods;.    retur
4320: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
4330: 0a 0a 20 20 65 54 79 70 65 20 3d 20 28 28 66 6c  ..  eType = ((fl
4340: 61 67 73 26 28 53 51 4c 49 54 45 5f 4f 50 45 4e  ags&(SQLITE_OPEN
4350: 5f 4d 41 49 4e 5f 44 42 29 29 3f 44 41 54 41 42  _MAIN_DB))?DATAB
4360: 41 53 45 5f 46 49 4c 45 3a 4a 4f 55 52 4e 41 4c  ASE_FILE:JOURNAL
4370: 5f 46 49 4c 45 29 3b 0a 20 20 70 2d 3e 62 61 73  _FILE);.  p->bas
4380: 65 2e 70 4d 65 74 68 6f 64 73 20 3d 20 26 66 73  e.pMethods = &fs
4390: 5f 69 6f 5f 6d 65 74 68 6f 64 73 3b 0a 20 20 70  _io_methods;.  p
43a0: 2d 3e 65 54 79 70 65 20 3d 20 65 54 79 70 65 3b  ->eType = eType;
43b0: 0a 0a 20 20 61 73 73 65 72 74 28 73 74 72 6c 65  ..  assert(strle
43c0: 6e 28 22 2d 6a 6f 75 72 6e 61 6c 22 29 3d 3d 38  n("-journal")==8
43d0: 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72  );.  nName = str
43e0: 6c 65 6e 28 7a 4e 61 6d 65 29 2d 28 28 65 54 79  len(zName)-((eTy
43f0: 70 65 3d 3d 4a 4f 55 52 4e 41 4c 5f 46 49 4c 45  pe==JOURNAL_FILE
4400: 29 3f 38 3a 30 29 3b 0a 20 20 70 52 65 61 6c 3d  )?8:0);.  pReal=
4410: 70 46 73 56 66 73 2d 3e 70 46 69 6c 65 4c 69 73  pFsVfs->pFileLis
4420: 74 3b 20 0a 20 20 66 6f 72 28 3b 20 70 52 65 61  t; .  for(; pRea
4430: 6c 20 26 26 20 73 74 72 6e 63 6d 70 28 70 52 65  l && strncmp(pRe
4440: 61 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  al->zName, zName
4450: 2c 20 6e 4e 61 6d 65 29 3b 20 70 52 65 61 6c 3d  , nName); pReal=
4460: 70 52 65 61 6c 2d 3e 70 4e 65 78 74 29 3b 0a 0a  pReal->pNext);..
4470: 20 20 69 66 28 20 21 70 52 65 61 6c 20 29 7b 0a    if( !pReal ){.
4480: 20 20 20 20 69 6e 74 20 72 65 61 6c 5f 66 6c 61      int real_fla
4490: 67 73 20 3d 20 28 66 6c 61 67 73 26 7e 28 53 51  gs = (flags&~(SQ
44a0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
44b0: 42 29 29 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  B))|SQLITE_OPEN_
44c0: 54 45 4d 50 5f 44 42 3b 0a 20 20 20 20 73 71 6c  TEMP_DB;.    sql
44d0: 69 74 65 33 5f 69 6e 74 36 34 20 73 69 7a 65 3b  ite3_int64 size;
44e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
44f0: 65 20 2a 70 52 65 61 6c 46 69 6c 65 3b 0a 20 20  e *pRealFile;.  
4500: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
4510: 50 61 72 65 6e 74 20 3d 20 70 46 73 56 66 73 2d  Parent = pFsVfs-
4520: 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 61 73  >pParent;.    as
4530: 73 65 72 74 28 65 54 79 70 65 3d 3d 44 41 54 41  sert(eType==DATA
4540: 42 41 53 45 5f 46 49 4c 45 29 3b 0a 0a 20 20 20  BASE_FILE);..   
4550: 20 70 52 65 61 6c 20 3d 20 28 66 73 5f 72 65 61   pReal = (fs_rea
4560: 6c 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  l_file *)sqlite3
4570: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  _malloc(sizeof(*
4580: 70 52 65 61 6c 29 2b 70 50 61 72 65 6e 74 2d 3e  pReal)+pParent->
4590: 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 20 20 69  szOsFile);.    i
45a0: 66 28 20 21 70 52 65 61 6c 20 29 7b 0a 20 20 20  f( !pReal ){.   
45b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
45c0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
45d0: 20 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d   open_out;.    }
45e0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 61  .    memset(pRea
45f0: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 52  l, 0, sizeof(*pR
4600: 65 61 6c 29 2b 70 50 61 72 65 6e 74 2d 3e 73 7a  eal)+pParent->sz
4610: 4f 73 46 69 6c 65 29 3b 0a 20 20 20 20 70 52 65  OsFile);.    pRe
4620: 61 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  al->zName = zNam
4630: 65 3b 0a 20 20 20 20 70 52 65 61 6c 2d 3e 70 46  e;.    pReal->pF
4640: 69 6c 65 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  ile = (sqlite3_f
4650: 69 6c 65 20 2a 29 28 26 70 52 65 61 6c 5b 31 5d  ile *)(&pReal[1]
4660: 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 50 61  );..    rc = pPa
4670: 72 65 6e 74 2d 3e 78 4f 70 65 6e 28 70 50 61 72  rent->xOpen(pPar
4680: 65 6e 74 2c 20 7a 4e 61 6d 65 2c 20 70 52 65 61  ent, zName, pRea
4690: 6c 2d 3e 70 46 69 6c 65 2c 20 72 65 61 6c 5f 66  l->pFile, real_f
46a0: 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 29  lags, pOutFlags)
46b0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
46c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
46d0: 20 67 6f 74 6f 20 6f 70 65 6e 5f 6f 75 74 3b 0a   goto open_out;.
46e0: 20 20 20 20 7d 0a 20 20 20 20 70 52 65 61 6c 46      }.    pRealF
46f0: 69 6c 65 20 3d 20 70 52 65 61 6c 2d 3e 70 46 69  ile = pReal->pFi
4700: 6c 65 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 52  le;..    rc = pR
4710: 65 61 6c 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ealFile->pMethod
4720: 73 2d 3e 78 46 69 6c 65 53 69 7a 65 28 70 52 65  s->xFileSize(pRe
4730: 61 6c 46 69 6c 65 2c 20 26 73 69 7a 65 29 3b 0a  alFile, &size);.
4740: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
4750: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
4760: 6f 74 6f 20 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  oto open_out;.  
4770: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 69 7a 65    }.    if( size
4780: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
4790: 3d 20 70 52 65 61 6c 46 69 6c 65 2d 3e 70 4d 65  = pRealFile->pMe
47a0: 74 68 6f 64 73 2d 3e 78 57 72 69 74 65 28 70 52  thods->xWrite(pR
47b0: 65 61 6c 46 69 6c 65 2c 20 22 5c 30 22 2c 20 31  ealFile, "\0", 1
47c0: 2c 20 42 4c 4f 42 53 49 5a 45 2d 31 29 3b 0a 20  , BLOBSIZE-1);. 
47d0: 20 20 20 20 20 70 52 65 61 6c 2d 3e 6e 42 6c 6f       pReal->nBlo
47e0: 62 20 3d 20 42 4c 4f 42 53 49 5a 45 3b 0a 20 20  b = BLOBSIZE;.  
47f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
4800: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 53 5b  nsigned char zS[
4810: 34 5d 3b 0a 20 20 20 20 20 20 70 52 65 61 6c 2d  4];.      pReal-
4820: 3e 6e 42 6c 6f 62 20 3d 20 73 69 7a 65 3b 0a 20  >nBlob = size;. 
4830: 20 20 20 20 20 72 63 20 3d 20 70 52 65 61 6c 46       rc = pRealF
4840: 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  ile->pMethods->x
4850: 52 65 61 64 28 70 52 65 61 6c 46 69 6c 65 2c 20  Read(pRealFile, 
4860: 7a 53 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 20  zS, 4, 0);.     
4870: 20 70 52 65 61 6c 2d 3e 6e 44 61 74 61 62 61 73   pReal->nDatabas
4880: 65 20 3d 20 28 7a 53 5b 30 5d 3c 3c 32 34 29 2b  e = (zS[0]<<24)+
4890: 28 7a 53 5b 31 5d 3c 3c 31 36 29 2b 28 7a 53 5b  (zS[1]<<16)+(zS[
48a0: 32 5d 3c 3c 38 29 2b 7a 53 5b 33 5d 3b 0a 20 20  2]<<8)+zS[3];.  
48b0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
48c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
48d0: 20 72 63 20 3d 20 70 52 65 61 6c 46 69 6c 65 2d   rc = pRealFile-
48e0: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61 64  >pMethods->xRead
48f0: 28 70 52 65 61 6c 46 69 6c 65 2c 20 7a 53 2c 20  (pRealFile, zS, 
4900: 34 2c 20 70 52 65 61 6c 2d 3e 6e 42 6c 6f 62 2d  4, pReal->nBlob-
4910: 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  4);.        if( 
4920: 7a 53 5b 30 5d 20 7c 7c 20 7a 53 5b 31 5d 20 7c  zS[0] || zS[1] |
4930: 7c 20 7a 53 5b 32 5d 20 7c 7c 20 7a 53 5b 33 5d  | zS[2] || zS[3]
4940: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52   ){.          pR
4950: 65 61 6c 2d 3e 6e 4a 6f 75 72 6e 61 6c 20 3d 20  eal->nJournal = 
4960: 70 52 65 61 6c 2d 3e 6e 42 6c 6f 62 3b 0a 20 20  pReal->nBlob;.  
4970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4980: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
4990: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
49a0: 20 20 20 20 20 20 70 52 65 61 6c 2d 3e 70 4e 65        pReal->pNe
49b0: 78 74 20 3d 20 70 46 73 56 66 73 2d 3e 70 46 69  xt = pFsVfs->pFi
49c0: 6c 65 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 66  leList;.      if
49d0: 28 20 70 52 65 61 6c 2d 3e 70 4e 65 78 74 20 29  ( pReal->pNext )
49e0: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 61 6c 2d  {.        pReal-
49f0: 3e 70 4e 65 78 74 2d 3e 70 70 54 68 69 73 20 3d  >pNext->ppThis =
4a00: 20 26 70 52 65 61 6c 2d 3e 70 4e 65 78 74 3b 0a   &pReal->pNext;.
4a10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52        }.      pR
4a20: 65 61 6c 2d 3e 70 70 54 68 69 73 20 3d 20 26 70  eal->ppThis = &p
4a30: 46 73 56 66 73 2d 3e 70 46 69 6c 65 4c 69 73 74  FsVfs->pFileList
4a40: 3b 0a 20 20 20 20 20 20 70 46 73 56 66 73 2d 3e  ;.      pFsVfs->
4a50: 70 46 69 6c 65 4c 69 73 74 20 3d 20 70 52 65 61  pFileList = pRea
4a60: 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 6f 70  l;.    }.  }..op
4a70: 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 52  en_out:.  if( pR
4a80: 65 61 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 72  eal ){.    if( r
4a90: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
4aa0: 20 20 20 20 20 20 70 2d 3e 70 52 65 61 6c 20 3d        p->pReal =
4ab0: 20 70 52 65 61 6c 3b 0a 20 20 20 20 20 20 70 52   pReal;.      pR
4ac0: 65 61 6c 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  eal->nRef++;.   
4ad0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
4ae0: 28 20 70 52 65 61 6c 2d 3e 70 46 69 6c 65 2d 3e  ( pReal->pFile->
4af0: 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
4b00: 20 20 20 20 70 52 65 61 6c 2d 3e 70 46 69 6c 65      pReal->pFile
4b10: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43 6c 6f  ->pMethods->xClo
4b20: 73 65 28 70 52 65 61 6c 2d 3e 70 46 69 6c 65 29  se(pReal->pFile)
4b30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4b40: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65  sqlite3_free(pRe
4b50: 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  al);.    }.  }. 
4b60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
4b70: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
4b80: 66 69 6c 65 20 6c 6f 63 61 74 65 64 20 61 74 20  file located at 
4b90: 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69  zPath. If the di
4ba0: 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69  rSync argument i
4bb0: 73 20 74 72 75 65 2c 0a 2a 2a 20 65 6e 73 75 72  s true,.** ensur
4bc0: 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
4bd0: 6d 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20  m modifications 
4be0: 61 72 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69  are synced to di
4bf0: 73 6b 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74  sk before.** ret
4c00: 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
4c10: 63 20 69 6e 74 20 66 73 44 65 6c 65 74 65 28 73  c int fsDelete(s
4c20: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
4c30: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
4c40: 61 74 68 2c 20 69 6e 74 20 64 69 72 53 79 6e 63  ath, int dirSync
4c50: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
4c60: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 73 5f 76 66  LITE_OK;.  fs_vf
4c70: 73 5f 74 20 2a 70 46 73 56 66 73 20 3d 20 28 66  s_t *pFsVfs = (f
4c80: 73 5f 76 66 73 5f 74 20 2a 29 70 56 66 73 3b 0a  s_vfs_t *)pVfs;.
4c90: 20 20 66 73 5f 72 65 61 6c 5f 66 69 6c 65 20 2a    fs_real_file *
4ca0: 70 52 65 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33  pReal;.  sqlite3
4cb0: 5f 66 69 6c 65 20 2a 70 46 3b 0a 20 20 69 6e 74  _file *pF;.  int
4cc0: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
4cd0: 7a 50 61 74 68 29 20 2d 20 38 3b 0a 0a 20 20 61  zPath) - 8;..  a
4ce0: 73 73 65 72 74 28 73 74 72 6c 65 6e 28 22 2d 6a  ssert(strlen("-j
4cf0: 6f 75 72 6e 61 6c 22 29 3d 3d 38 29 3b 0a 20 20  ournal")==8);.  
4d00: 61 73 73 65 72 74 28 73 74 72 63 6d 70 28 22 2d  assert(strcmp("-
4d10: 6a 6f 75 72 6e 61 6c 22 2c 20 26 7a 50 61 74 68  journal", &zPath
4d20: 5b 6e 4e 61 6d 65 5d 29 3d 3d 30 29 3b 0a 0a 20  [nName])==0);.. 
4d30: 20 70 52 65 61 6c 20 3d 20 70 46 73 56 66 73 2d   pReal = pFsVfs-
4d40: 3e 70 46 69 6c 65 4c 69 73 74 3b 20 0a 20 20 66  >pFileList; .  f
4d50: 6f 72 28 3b 20 70 52 65 61 6c 20 26 26 20 73 74  or(; pReal && st
4d60: 72 6e 63 6d 70 28 70 52 65 61 6c 2d 3e 7a 4e 61  rncmp(pReal->zNa
4d70: 6d 65 2c 20 7a 50 61 74 68 2c 20 6e 4e 61 6d 65  me, zPath, nName
4d80: 29 3b 20 70 52 65 61 6c 3d 70 52 65 61 6c 2d 3e  ); pReal=pReal->
4d90: 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 70 52  pNext);.  if( pR
4da0: 65 61 6c 20 29 7b 0a 20 20 20 20 70 46 20 3d 20  eal ){.    pF = 
4db0: 70 52 65 61 6c 2d 3e 70 46 69 6c 65 3b 0a 20 20  pReal->pFile;.  
4dc0: 20 20 72 63 20 3d 20 70 46 2d 3e 70 4d 65 74 68    rc = pF->pMeth
4dd0: 6f 64 73 2d 3e 78 57 72 69 74 65 28 70 46 2c 20  ods->xWrite(pF, 
4de0: 22 5c 30 5c 30 5c 30 5c 30 22 2c 20 34 2c 20 70  "\0\0\0\0", 4, p
4df0: 52 65 61 6c 2d 3e 6e 42 6c 6f 62 2d 42 4c 4f 43  Real->nBlob-BLOC
4e00: 4b 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20  KSIZE);.    if( 
4e10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4e20: 0a 20 20 20 20 20 20 70 52 65 61 6c 2d 3e 6e 4a  .      pReal->nJ
4e30: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
4e40: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
4e50: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  c;.}../*.** Test
4e60: 20 66 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d   for access perm
4e70: 69 73 73 69 6f 6e 73 2e 20 52 65 74 75 72 6e 20  issions. Return 
4e80: 74 72 75 65 20 69 66 20 74 68 65 20 72 65 71 75  true if the requ
4e90: 65 73 74 65 64 20 70 65 72 6d 69 73 73 69 6f 6e  ested permission
4ea0: 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
4eb0: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
4ec0: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
4ed0: 69 6e 74 20 66 73 41 63 63 65 73 73 28 0a 20 20  int fsAccess(.  
4ee0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
4ef0: 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  s, .  const char
4f00: 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74 20   *zPath, .  int 
4f10: 66 6c 61 67 73 2c 20 0a 20 20 69 6e 74 20 2a 70  flags, .  int *p
4f20: 52 65 73 4f 75 74 0a 29 7b 0a 20 20 66 73 5f 76  ResOut.){.  fs_v
4f30: 66 73 5f 74 20 2a 70 46 73 56 66 73 20 3d 20 28  fs_t *pFsVfs = (
4f40: 66 73 5f 76 66 73 5f 74 20 2a 29 70 56 66 73 3b  fs_vfs_t *)pVfs;
4f50: 0a 20 20 66 73 5f 72 65 61 6c 5f 66 69 6c 65 20  .  fs_real_file 
4f60: 2a 70 52 65 61 6c 3b 0a 20 20 69 6e 74 20 69 73  *pReal;.  int is
4f70: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 69  Journal = 0;.  i
4f80: 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65  nt nName = strle
4f90: 6e 28 7a 50 61 74 68 29 3b 0a 0a 20 20 69 66 28  n(zPath);..  if(
4fa0: 20 66 6c 61 67 73 21 3d 53 51 4c 49 54 45 5f 41   flags!=SQLITE_A
4fb0: 43 43 45 53 53 5f 45 58 49 53 54 53 20 29 7b 0a  CCESS_EXISTS ){.
4fc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
4fd0: 2a 70 50 61 72 65 6e 74 20 3d 20 28 28 66 73 5f  *pParent = ((fs_
4fe0: 76 66 73 5f 74 20 2a 29 70 56 66 73 29 2d 3e 70  vfs_t *)pVfs)->p
4ff0: 50 61 72 65 6e 74 3b 0a 20 20 20 20 72 65 74 75  Parent;.    retu
5000: 72 6e 20 70 50 61 72 65 6e 74 2d 3e 78 41 63 63  rn pParent->xAcc
5010: 65 73 73 28 70 50 61 72 65 6e 74 2c 20 7a 50 61  ess(pParent, zPa
5020: 74 68 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f  th, flags, pResO
5030: 75 74 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ut);.  }..  asse
5040: 72 74 28 73 74 72 6c 65 6e 28 22 2d 6a 6f 75 72  rt(strlen("-jour
5050: 6e 61 6c 22 29 3d 3d 38 29 3b 0a 20 20 69 66 28  nal")==8);.  if(
5060: 20 6e 4e 61 6d 65 3e 38 20 26 26 20 73 74 72 63   nName>8 && strc
5070: 6d 70 28 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 26  mp("-journal", &
5080: 7a 50 61 74 68 5b 6e 4e 61 6d 65 2d 38 5d 29 3d  zPath[nName-8])=
5090: 3d 30 20 29 7b 0a 20 20 20 20 6e 4e 61 6d 65 20  =0 ){.    nName 
50a0: 2d 3d 20 38 3b 0a 20 20 20 20 69 73 4a 6f 75 72  -= 8;.    isJour
50b0: 6e 61 6c 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  nal = 1;.  }..  
50c0: 70 52 65 61 6c 20 3d 20 70 46 73 56 66 73 2d 3e  pReal = pFsVfs->
50d0: 70 46 69 6c 65 4c 69 73 74 3b 20 0a 20 20 66 6f  pFileList; .  fo
50e0: 72 28 3b 20 70 52 65 61 6c 20 26 26 20 73 74 72  r(; pReal && str
50f0: 6e 63 6d 70 28 70 52 65 61 6c 2d 3e 7a 4e 61 6d  ncmp(pReal->zNam
5100: 65 2c 20 7a 50 61 74 68 2c 20 6e 4e 61 6d 65 29  e, zPath, nName)
5110: 3b 20 70 52 65 61 6c 3d 70 52 65 61 6c 2d 3e 70  ; pReal=pReal->p
5120: 4e 65 78 74 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  Next);..  *pResO
5130: 75 74 20 3d 20 28 70 52 65 61 6c 20 26 26 20 28  ut = (pReal && (
5140: 21 69 73 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 52  !isJournal || pR
5150: 65 61 6c 2d 3e 6e 4a 6f 75 72 6e 61 6c 3e 30 29  eal->nJournal>0)
5160: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
5170: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5180: 50 6f 70 75 6c 61 74 65 20 62 75 66 66 65 72 20  Populate buffer 
5190: 7a 4f 75 74 20 77 69 74 68 20 74 68 65 20 66 75  zOut with the fu
51a0: 6c 6c 20 63 61 6e 6f 6e 69 63 61 6c 20 70 61 74  ll canonical pat
51b0: 68 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64  hname correspond
51c0: 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ing.** to the pa
51d0: 74 68 6e 61 6d 65 20 69 6e 20 7a 50 61 74 68 2e  thname in zPath.
51e0: 20 7a 4f 75 74 20 69 73 20 67 75 61 72 61 6e 74   zOut is guarant
51f0: 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
5200: 61 20 62 75 66 66 65 72 0a 2a 2a 20 6f 66 20 61  a buffer.** of a
5210: 74 20 6c 65 61 73 74 20 28 46 53 5f 4d 41 58 5f  t least (FS_MAX_
5220: 50 41 54 48 4e 41 4d 45 2b 31 29 20 62 79 74 65  PATHNAME+1) byte
5230: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
5240: 20 66 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28   fsFullPathname(
5250: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
5260: 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
5270: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
5280: 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  fs object */.  c
5290: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
52a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
52b0: 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76  Possibly relativ
52c0: 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a  e input path */.
52d0: 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20    int nOut,     
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52f0: 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75  /* Size of outpu
5300: 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65  t buffer in byte
5310: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75  s */.  char *zOu
5320: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
5330: 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62       /* Output b
5340: 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71  uffer */.){.  sq
5350: 6c 69 74 65 33 5f 76 66 73 20 2a 70 50 61 72 65  lite3_vfs *pPare
5360: 6e 74 20 3d 20 28 28 66 73 5f 76 66 73 5f 74 20  nt = ((fs_vfs_t 
5370: 2a 29 70 56 66 73 29 2d 3e 70 50 61 72 65 6e 74  *)pVfs)->pParent
5380: 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 65  ;.  return pPare
5390: 6e 74 2d 3e 78 46 75 6c 6c 50 61 74 68 6e 61 6d  nt->xFullPathnam
53a0: 65 28 70 50 61 72 65 6e 74 2c 20 7a 50 61 74 68  e(pParent, zPath
53b0: 2c 20 6e 4f 75 74 2c 20 7a 4f 75 74 29 3b 0a 7d  , nOut, zOut);.}
53c0: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
53d0: 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79   dynamic library
53e0: 20 6c 6f 63 61 74 65 64 20 61 74 20 7a 50 61 74   located at zPat
53f0: 68 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 68  h and return a h
5400: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
5410: 20 76 6f 69 64 20 2a 66 73 44 6c 4f 70 65 6e 28   void *fsDlOpen(
5420: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
5430: 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  s, const char *z
5440: 50 61 74 68 29 7b 0a 20 20 73 71 6c 69 74 65 33  Path){.  sqlite3
5450: 5f 76 66 73 20 2a 70 50 61 72 65 6e 74 20 3d 20  _vfs *pParent = 
5460: 28 28 66 73 5f 76 66 73 5f 74 20 2a 29 70 56 66  ((fs_vfs_t *)pVf
5470: 73 29 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 72  s)->pParent;.  r
5480: 65 74 75 72 6e 20 70 50 61 72 65 6e 74 2d 3e 78  eturn pParent->x
5490: 44 6c 4f 70 65 6e 28 70 50 61 72 65 6e 74 2c 20  DlOpen(pParent, 
54a0: 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zPath);.}../*.**
54b0: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75   Populate the bu
54c0: 66 66 65 72 20 7a 45 72 72 4d 73 67 20 28 73 69  ffer zErrMsg (si
54d0: 7a 65 20 6e 42 79 74 65 20 62 79 74 65 73 29 20  ze nByte bytes) 
54e0: 77 69 74 68 20 61 20 68 75 6d 61 6e 20 72 65 61  with a human rea
54f0: 64 61 62 6c 65 0a 2a 2a 20 75 74 66 2d 38 20 73  dable.** utf-8 s
5500: 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67  tring describing
5510: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
5520: 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
5530: 65 64 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a  ed associated .*
5540: 2a 20 77 69 74 68 20 64 79 6e 61 6d 69 63 20 6c  * with dynamic l
5550: 69 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 73 74 61  ibraries..*/.sta
5560: 74 69 63 20 76 6f 69 64 20 66 73 44 6c 45 72 72  tic void fsDlErr
5570: 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
5580: 70 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c  pVfs, int nByte,
5590: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 29 7b   char *zErrMsg){
55a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
55b0: 70 50 61 72 65 6e 74 20 3d 20 28 28 66 73 5f 76  pParent = ((fs_v
55c0: 66 73 5f 74 20 2a 29 70 56 66 73 29 2d 3e 70 50  fs_t *)pVfs)->pP
55d0: 61 72 65 6e 74 3b 0a 20 20 70 50 61 72 65 6e 74  arent;.  pParent
55e0: 2d 3e 78 44 6c 45 72 72 6f 72 28 70 50 61 72 65  ->xDlError(pPare
55f0: 6e 74 2c 20 6e 42 79 74 65 2c 20 7a 45 72 72 4d  nt, nByte, zErrM
5600: 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  sg);.}../*.** Re
5610: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
5620: 6f 20 74 68 65 20 73 79 6d 62 6f 6c 20 7a 53 79  o the symbol zSy
5630: 6d 62 6f 6c 20 69 6e 20 74 68 65 20 64 79 6e 61  mbol in the dyna
5640: 6d 69 63 20 6c 69 62 72 61 72 79 20 70 48 61 6e  mic library pHan
5650: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dle..*/.static v
5660: 6f 69 64 20 28 2a 66 73 44 6c 53 79 6d 28 73 71  oid (*fsDlSym(sq
5670: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
5680: 20 76 6f 69 64 20 2a 70 48 2c 20 63 6f 6e 73 74   void *pH, const
5690: 20 63 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f   char *zSym))(vo
56a0: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  id){.  sqlite3_v
56b0: 66 73 20 2a 70 50 61 72 65 6e 74 20 3d 20 28 28  fs *pParent = ((
56c0: 66 73 5f 76 66 73 5f 74 20 2a 29 70 56 66 73 29  fs_vfs_t *)pVfs)
56d0: 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 72 65 74  ->pParent;.  ret
56e0: 75 72 6e 20 70 50 61 72 65 6e 74 2d 3e 78 44 6c  urn pParent->xDl
56f0: 53 79 6d 28 70 50 61 72 65 6e 74 2c 20 70 48 2c  Sym(pParent, pH,
5700: 20 7a 53 79 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zSym);.}../*.**
5710: 20 43 6c 6f 73 65 20 74 68 65 20 64 79 6e 61 6d   Close the dynam
5720: 69 63 20 6c 69 62 72 61 72 79 20 68 61 6e 64 6c  ic library handl
5730: 65 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  e pHandle..*/.st
5740: 61 74 69 63 20 76 6f 69 64 20 66 73 44 6c 43 6c  atic void fsDlCl
5750: 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
5760: 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61  *pVfs, void *pHa
5770: 6e 64 6c 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  ndle){.  sqlite3
5780: 5f 76 66 73 20 2a 70 50 61 72 65 6e 74 20 3d 20  _vfs *pParent = 
5790: 28 28 66 73 5f 76 66 73 5f 74 20 2a 29 70 56 66  ((fs_vfs_t *)pVf
57a0: 73 29 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 70  s)->pParent;.  p
57b0: 50 61 72 65 6e 74 2d 3e 78 44 6c 43 6c 6f 73 65  Parent->xDlClose
57c0: 28 70 50 61 72 65 6e 74 2c 20 70 48 61 6e 64 6c  (pParent, pHandl
57d0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70  e);.}../*.** Pop
57e0: 75 6c 61 74 65 20 74 68 65 20 62 75 66 66 65 72  ulate the buffer
57f0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
5800: 42 75 66 4f 75 74 20 77 69 74 68 20 6e 42 79 74  BufOut with nByt
5810: 65 20 62 79 74 65 73 20 6f 66 20 0a 2a 2a 20 72  e bytes of .** r
5820: 61 6e 64 6f 6d 20 64 61 74 61 2e 0a 2a 2f 0a 73  andom data..*/.s
5830: 74 61 74 69 63 20 69 6e 74 20 66 73 52 61 6e 64  tatic int fsRand
5840: 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76  omness(sqlite3_v
5850: 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
5860: 79 74 65 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f  yte, char *zBufO
5870: 75 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ut){.  sqlite3_v
5880: 66 73 20 2a 70 50 61 72 65 6e 74 20 3d 20 28 28  fs *pParent = ((
5890: 66 73 5f 76 66 73 5f 74 20 2a 29 70 56 66 73 29  fs_vfs_t *)pVfs)
58a0: 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 72 65 74  ->pParent;.  ret
58b0: 75 72 6e 20 70 50 61 72 65 6e 74 2d 3e 78 52 61  urn pParent->xRa
58c0: 6e 64 6f 6d 6e 65 73 73 28 70 50 61 72 65 6e 74  ndomness(pParent
58d0: 2c 20 6e 42 79 74 65 2c 20 7a 42 75 66 4f 75 74  , nByte, zBufOut
58e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  );.}../*.** Slee
58f0: 70 20 66 6f 72 20 6e 4d 69 63 72 6f 20 6d 69 63  p for nMicro mic
5900: 72 6f 73 65 63 6f 6e 64 73 2e 20 52 65 74 75 72  roseconds. Retur
5910: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
5920: 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 0a 2a 2a  microseconds .**
5930: 20 61 63 74 75 61 6c 6c 79 20 73 6c 65 70 74 2e   actually slept.
5940: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
5950: 73 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76  sSleep(sqlite3_v
5960: 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 4d  fs *pVfs, int nM
5970: 69 63 72 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33  icro){.  sqlite3
5980: 5f 76 66 73 20 2a 70 50 61 72 65 6e 74 20 3d 20  _vfs *pParent = 
5990: 28 28 66 73 5f 76 66 73 5f 74 20 2a 29 70 56 66  ((fs_vfs_t *)pVf
59a0: 73 29 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 72  s)->pParent;.  r
59b0: 65 74 75 72 6e 20 70 50 61 72 65 6e 74 2d 3e 78  eturn pParent->x
59c0: 53 6c 65 65 70 28 70 50 61 72 65 6e 74 2c 20 6e  Sleep(pParent, n
59d0: 4d 69 63 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Micro);.}../*.**
59e0: 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
59f0: 65 6e 74 20 74 69 6d 65 20 61 73 20 61 20 4a 75  ent time as a Ju
5a00: 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
5a10: 69 6e 20 2a 70 54 69 6d 65 4f 75 74 2e 0a 2a 2f  in *pTimeOut..*/
5a20: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 73 43 75  .static int fsCu
5a30: 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
5a40: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75  3_vfs *pVfs, dou
5a50: 62 6c 65 20 2a 70 54 69 6d 65 4f 75 74 29 7b 0a  ble *pTimeOut){.
5a60: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
5a70: 50 61 72 65 6e 74 20 3d 20 28 28 66 73 5f 76 66  Parent = ((fs_vf
5a80: 73 5f 74 20 2a 29 70 56 66 73 29 2d 3e 70 50 61  s_t *)pVfs)->pPa
5a90: 72 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 70  rent;.  return p
5aa0: 50 61 72 65 6e 74 2d 3e 78 43 75 72 72 65 6e 74  Parent->xCurrent
5ab0: 54 69 6d 65 28 70 50 61 72 65 6e 74 2c 20 70 54  Time(pParent, pT
5ac0: 69 6d 65 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  imeOut);.}../*.*
5ad0: 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  * This procedure
5ae0: 20 72 65 67 69 73 74 65 72 73 20 74 68 65 20 66   registers the f
5af0: 73 20 76 66 73 20 77 69 74 68 20 53 51 4c 69 74  s vfs with SQLit
5b00: 65 2e 20 49 66 20 74 68 65 20 61 72 67 75 6d 65  e. If the argume
5b10: 6e 74 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74  nt is.** true, t
5b20: 68 65 20 66 73 20 76 66 73 20 62 65 63 6f 6d 65  he fs vfs become
5b30: 73 20 74 68 65 20 6e 65 77 20 64 65 66 61 75 6c  s the new defaul
5b40: 74 20 76 66 73 2e 20 49 74 20 69 73 20 74 68 65  t vfs. It is the
5b50: 20 6f 6e 6c 79 20 70 75 62 6c 69 63 6c 79 0a 2a   only publicly.*
5b60: 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 75 6e 63  * available func
5b70: 74 69 6f 6e 20 69 6e 20 74 68 69 73 20 66 69 6c  tion in this fil
5b80: 65 2e 0a 2a 2f 0a 69 6e 74 20 66 73 5f 72 65 67  e..*/.int fs_reg
5b90: 69 73 74 65 72 28 76 6f 69 64 29 7b 0a 20 20 69  ister(void){.  i
5ba0: 66 28 20 66 73 5f 76 66 73 2e 70 50 61 72 65 6e  f( fs_vfs.pParen
5bb0: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
5bc0: 45 5f 4f 4b 3b 0a 20 20 66 73 5f 76 66 73 2e 70  E_OK;.  fs_vfs.p
5bd0: 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  Parent = sqlite3
5be0: 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
5bf0: 66 73 5f 76 66 73 2e 62 61 73 65 2e 6d 78 50 61  fs_vfs.base.mxPa
5c00: 74 68 6e 61 6d 65 20 3d 20 66 73 5f 76 66 73 2e  thname = fs_vfs.
5c10: 70 50 61 72 65 6e 74 2d 3e 6d 78 50 61 74 68 6e  pParent->mxPathn
5c20: 61 6d 65 3b 0a 20 20 66 73 5f 76 66 73 2e 62 61  ame;.  fs_vfs.ba
5c30: 73 65 2e 73 7a 4f 73 46 69 6c 65 20 3d 20 4d 41  se.szOsFile = MA
5c40: 58 28 73 69 7a 65 6f 66 28 74 6d 70 5f 66 69 6c  X(sizeof(tmp_fil
5c50: 65 29 2c 20 73 69 7a 65 6f 66 28 66 73 5f 66 69  e), sizeof(fs_fi
5c60: 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  le));.  return s
5c70: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
5c80: 74 65 72 28 26 66 73 5f 76 66 73 2e 62 61 73 65  ter(&fs_vfs.base
5c90: 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  , 0);.}..#ifdef 
5ca0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
5cb0: 74 20 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66  t SqlitetestOnef
5cc0: 69 6c 65 5f 49 6e 69 74 28 29 20 7b 72 65 74 75  ile_Init() {retu
5cd0: 72 6e 20 66 73 5f 72 65 67 69 73 74 65 72 28 29  rn fs_register()
5ce0: 3b 7d 0a 23 65 6e 64 69 66 0a                    ;}.#endif.