/ Hex Artifact Content
Login

Artifact e2fe07646dff6300b48d49b2fee2fe192ed389e834dd635e3b3bac0ce0bf9f8f:


0000: 2f 2a 0a 2a 2a 20 32 30 31 36 20 53 65 70 74 65  /*.** 2016 Septe
0010: 6d 62 65 72 20 31 30 0a 2a 2a 0a 2a 2a 20 54 68  mber 10.**.** 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 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 65 73  ile contains tes
0190: 74 20 63 6f 64 65 20 74 6f 20 64 65 6c 65 74 65  t code to delete
01a0: 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
01b0: 61 73 65 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 6f  ase and all.** o
01c0: 66 20 69 74 73 20 61 73 73 6f 63 69 61 74 65 64  f its associated
01d0: 20 66 69 6c 65 73 2e 20 41 73 73 6f 63 69 61 74   files. Associat
01e0: 65 64 20 66 69 6c 65 73 20 69 6e 63 6c 75 64 65  ed files include
01f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
0200: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
0210: 20 20 20 2a 20 54 68 65 20 77 61 6c 20 66 69 6c     * The wal fil
0220: 65 2e 0a 2a 2a 20 20 20 2a 20 54 68 65 20 53 51  e..**   * The SQ
0230: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
0240: 4e 41 4d 45 53 20 76 65 72 73 69 6f 6e 20 6f 66  NAMES version of
0250: 20 74 68 65 20 64 62 2c 20 6a 6f 75 72 6e 61 6c   the db, journal
0260: 20 6f 72 20 77 61 6c 20 66 69 6c 65 73 2e 0a 2a   or wal files..*
0270: 2a 20 20 20 2a 20 46 69 6c 65 73 20 63 72 65 61  *   * Files crea
0280: 74 65 64 20 62 79 20 74 68 65 20 74 65 73 74 5f  ted by the test_
0290: 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75  multiplex.c modu
02a0: 6c 65 20 74 6f 20 65 78 74 65 6e 64 20 61 6e 79  le to extend any
02b0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20   of the .**     
02c0: 61 62 6f 76 65 2e 0a 2a 2f 0a 0a 23 69 66 6e 64  above..*/..#ifnd
02d0: 65 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  ef SQLITE_OS_WIN
02e0: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e 69  .#  include <uni
02f0: 73 74 64 2e 68 3e 0a 23 20 20 69 6e 63 6c 75 64  std.h>.#  includ
0300: 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 65 6e 64  e <errno.h>.#end
0310: 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72  if.#include <str
0320: 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ing.h>.#include 
0330: 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c  <assert.h>.#incl
0340: 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a  ude "sqlite3.h".
0350: 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ./* The followin
0360: 67 20 23 64 65 66 69 6e 65 73 20 61 72 65 20 63  g #defines are c
0370: 6f 70 69 65 64 20 66 72 6f 6d 20 74 65 73 74 5f  opied from test_
0380: 6d 75 6c 74 69 70 6c 65 78 2e 63 20 2a 2f 0a 23  multiplex.c */.#
0390: 69 66 6e 64 65 66 20 4d 58 5f 43 48 55 4e 4b 5f  ifndef MX_CHUNK_
03a0: 4e 55 4d 42 45 52 20 0a 23 20 64 65 66 69 6e 65  NUMBER .# define
03b0: 20 4d 58 5f 43 48 55 4e 4b 5f 4e 55 4d 42 45 52   MX_CHUNK_NUMBER
03c0: 20 32 39 39 0a 23 65 6e 64 69 66 0a 23 69 66 6e   299.#endif.#ifn
03d0: 64 65 66 20 53 51 4c 49 54 45 5f 4d 55 4c 54 49  def SQLITE_MULTI
03e0: 50 4c 45 58 5f 4a 4f 55 52 4e 41 4c 5f 38 5f 33  PLEX_JOURNAL_8_3
03f0: 5f 4f 46 46 53 45 54 0a 23 20 64 65 66 69 6e 65  _OFFSET.# define
0400: 20 53 51 4c 49 54 45 5f 4d 55 4c 54 49 50 4c 45   SQLITE_MULTIPLE
0410: 58 5f 4a 4f 55 52 4e 41 4c 5f 38 5f 33 5f 4f 46  X_JOURNAL_8_3_OF
0420: 46 53 45 54 20 34 30 30 0a 23 65 6e 64 69 66 0a  FSET 400.#endif.
0430: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d  #ifndef SQLITE_M
0440: 55 4c 54 49 50 4c 45 58 5f 57 41 4c 5f 38 5f 33  ULTIPLEX_WAL_8_3
0450: 5f 4f 46 46 53 45 54 0a 23 20 64 65 66 69 6e 65  _OFFSET.# define
0460: 20 53 51 4c 49 54 45 5f 4d 55 4c 54 49 50 4c 45   SQLITE_MULTIPLE
0470: 58 5f 57 41 4c 5f 38 5f 33 5f 4f 46 46 53 45 54  X_WAL_8_3_OFFSET
0480: 20 37 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   700.#endif../*.
0490: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
04a0: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 28 6d 6f  is a copy of (mo
04b0: 73 74 20 6f 66 29 20 74 68 65 20 63 6f 64 65 20  st of) the code 
04c0: 66 72 6f 6d 20 53 51 4c 69 74 65 20 66 75 6e 63  from SQLite func
04d0: 74 69 6f 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 46  tion.** sqlite3F
04e0: 69 6c 65 53 75 66 66 69 78 33 28 29 2e 20 49 74  ileSuffix3(). It
04f0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 66 69   modifies the fi
0500: 6c 65 6e 61 6d 65 20 69 6e 20 62 75 66 66 65 72  lename in buffer
0510: 20 7a 20 69 6e 20 74 68 65 0a 2a 2a 20 73 61 6d   z in the.** sam
0520: 65 20 77 61 79 20 61 73 20 53 51 4c 69 74 65 20  e way as SQLite 
0530: 64 6f 65 73 20 77 68 65 6e 20 69 6e 20 38 2e 33  does when in 8.3
0540: 20 66 69 6c 65 6e 61 6d 65 73 20 6d 6f 64 65 2e   filenames mode.
0550: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0560: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 38 33 4e  sqlite3Delete83N
0570: 61 6d 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  ame(char *z){.  
0580: 69 6e 74 20 69 2c 20 73 7a 3b 0a 20 20 73 7a 20  int i, sz;.  sz 
0590: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29  = (int)strlen(z)
05a0: 3b 0a 20 20 66 6f 72 28 69 3d 73 7a 2d 31 3b 20  ;.  for(i=sz-1; 
05b0: 69 3e 30 20 26 26 20 7a 5b 69 5d 21 3d 27 2f 27  i>0 && z[i]!='/'
05c0: 20 26 26 20 7a 5b 69 5d 21 3d 27 2e 27 3b 20 69   && z[i]!='.'; i
05d0: 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 7a 5b 69 5d  --){}.  if( z[i]
05e0: 3d 3d 27 2e 27 20 26 26 20 28 73 7a 3e 69 2b 34  =='.' && (sz>i+4
05f0: 29 20 29 20 6d 65 6d 6d 6f 76 65 28 26 7a 5b 69  ) ) memmove(&z[i
0600: 2b 31 5d 2c 20 26 7a 5b 73 7a 2d 33 5d 2c 20 34  +1], &z[sz-3], 4
0610: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 7a 46 69 6c  );.}../*.** zFil
0620: 65 20 69 73 20 61 20 66 69 6c 65 6e 61 6d 65 2e  e is a filename.
0630: 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   Assuming no err
0640: 6f 72 20 6f 63 63 75 72 73 2c 20 69 66 20 74 68  or occurs, if th
0650: 69 73 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  is file exists, 
0660: 0a 2a 2a 20 73 65 74 20 2a 70 62 45 78 69 73 74  .** set *pbExist
0670: 73 20 74 6f 20 74 72 75 65 20 61 6e 64 20 75 6e  s to true and un
0680: 6c 69 6e 6b 20 69 74 2e 20 4f 72 2c 20 69 66 20  link it. Or, if 
0690: 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
06a0: 74 20 65 78 69 73 74 2c 0a 2a 2a 20 73 65 74 20  t exist,.** set 
06b0: 2a 70 62 45 78 69 73 74 73 20 74 6f 20 66 61 6c  *pbExists to fal
06c0: 73 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  se before return
06d0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
06e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6e   error occurs, n
06f0: 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
0700: 6e 65 64 2e 20 4f 72 2c 20 69 66 20 6e 6f 20 65  ned. Or, if no e
0710: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 7a 65 72  rror occurs, zer
0720: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
0730: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 55 6e   sqlite3DeleteUn
0740: 6c 69 6e 6b 49 66 45 78 69 73 74 73 28 0a 20 20  linkIfExists(.  
0750: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
0760: 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  s,.  const char 
0770: 2a 7a 46 69 6c 65 2c 20 0a 20 20 69 6e 74 20 2a  *zFile, .  int *
0780: 70 62 45 78 69 73 74 73 0a 29 7b 0a 20 20 69 6e  pbExists.){.  in
0790: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  t rc = SQLITE_ER
07a0: 52 4f 52 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ROR;.#if SQLITE_
07b0: 4f 53 5f 57 49 4e 0a 20 20 69 66 28 20 70 56 66  OS_WIN.  if( pVf
07c0: 73 20 29 7b 0a 20 20 20 20 69 66 28 20 70 62 45  s ){.    if( pbE
07d0: 78 69 73 74 73 20 29 20 2a 70 62 45 78 69 73 74  xists ) *pbExist
07e0: 73 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20  s = 1;.    rc = 
07f0: 70 56 66 73 2d 3e 78 44 65 6c 65 74 65 28 70 56  pVfs->xDelete(pV
0800: 66 73 2c 20 7a 46 69 6c 65 2c 20 30 29 3b 0a 20  fs, zFile, 0);. 
0810: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
0820: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
0830: 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 69 66  OENT ){.      if
0840: 28 20 70 62 45 78 69 73 74 73 20 29 20 2a 70 62  ( pbExists ) *pb
0850: 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 20 20  Exists = 0;.    
0860: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
0870: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
0880: 65 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  e.  assert( pVfs
0890: 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 61 63  ==0 );.  rc = ac
08a0: 63 65 73 73 28 7a 46 69 6c 65 2c 20 46 5f 4f 4b  cess(zFile, F_OK
08b0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
08c0: 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 4e     if( errno==EN
08d0: 4f 45 4e 54 20 29 7b 20 0a 20 20 20 20 20 20 69  OENT ){ .      i
08e0: 66 28 20 70 62 45 78 69 73 74 73 20 29 20 2a 70  f( pbExists ) *p
08f0: 62 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 20  bExists = 0;.   
0900: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
0910: 4b 3b 20 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  K; .    }.  }els
0920: 65 7b 0a 20 20 20 20 69 66 28 20 70 62 45 78 69  e{.    if( pbExi
0930: 73 74 73 20 29 20 2a 70 62 45 78 69 73 74 73 20  sts ) *pbExists 
0940: 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e  = 1;.    rc = un
0950: 6c 69 6e 6b 28 7a 46 69 6c 65 29 3b 0a 20 20 7d  link(zFile);.  }
0960: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
0970: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
0980: 6c 65 74 65 20 74 68 65 20 64 61 74 61 62 61 73  lete the databas
0990: 65 20 66 69 6c 65 20 69 64 65 6e 74 69 66 69 65  e file identifie
09a0: 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20  d by the string 
09b0: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
09c0: 74 6f 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  to this.** funct
09d0: 69 6f 6e 2e 20 54 68 65 20 73 74 72 69 6e 67 20  ion. The string 
09e0: 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 61 20 66  must contain a f
09f0: 69 6c 65 6e 61 6d 65 2c 20 6e 6f 74 20 61 6e 20  ilename, not an 
0a00: 53 51 4c 69 74 65 20 55 52 49 2e 0a 2a 2f 0a 53  SQLite URI..*/.S
0a10: 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71  QLITE_API int sq
0a20: 6c 69 74 65 33 5f 64 65 6c 65 74 65 5f 64 61 74  lite3_delete_dat
0a30: 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63  abase(.  const c
0a40: 68 61 72 20 2a 7a 46 69 6c 65 20 20 20 20 20 20  har *zFile      
0a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
0a60: 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 29 7b   to delete */.){
0a70: 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 20 20  .  char *zBuf;  
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
0aa0: 73 70 72 69 6e 74 66 28 29 20 66 69 6c 65 6e 61  sprintf() filena
0ab0: 6d 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  mes to */.  int 
0ac0: 6e 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  nBuf;           
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
0ae0: 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 69 6e  ize of buffer in
0af0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
0b00: 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
0b20: 79 73 74 65 6d 20 65 72 72 6f 72 20 63 6f 64 65  ystem error code
0b30: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65        /* Iterate
0b60: 20 74 68 72 6f 75 67 68 20 61 7a 46 6d 74 5b 5d   through azFmt[]
0b70: 20 61 6e 64 20 61 4d 46 69 6c 65 5b 5d 20 2a 2f   and aMFile[] */
0b80: 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
0b90: 61 7a 46 6d 74 5b 5d 20 3d 20 7b 20 22 25 73 22  azFmt[] = { "%s"
0ba0: 2c 20 22 25 73 2d 6a 6f 75 72 6e 61 6c 22 2c 20  , "%s-journal", 
0bb0: 22 25 73 2d 77 61 6c 22 2c 20 22 25 73 2d 73 68  "%s-wal", "%s-sh
0bc0: 6d 22 20 7d 3b 0a 0a 20 20 73 74 72 75 63 74 20  m" };..  struct 
0bd0: 4d 46 69 6c 65 20 7b 0a 20 20 20 20 63 6f 6e 73  MFile {.    cons
0be0: 74 20 63 68 61 72 20 2a 7a 46 6d 74 3b 0a 20 20  t char *zFmt;.  
0bf0: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
0c00: 20 20 20 69 6e 74 20 62 38 33 3b 0a 20 20 7d 20     int b83;.  } 
0c10: 61 4d 46 69 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20  aMFile[] = {.   
0c20: 20 7b 20 22 25 73 25 30 33 64 22 2c 20 20 20 20   { "%s%03d",    
0c30: 20 20 20 20 20 30 2c 20 20 20 30 20 7d 2c 0a 20       0,   0 },. 
0c40: 20 20 20 7b 20 22 25 73 2d 6a 6f 75 72 6e 61 6c     { "%s-journal
0c50: 25 30 33 64 22 2c 20 30 2c 20 20 20 30 20 7d 2c  %03d", 0,   0 },
0c60: 0a 20 20 20 20 7b 20 22 25 73 2d 77 61 6c 25 30  .    { "%s-wal%0
0c70: 33 64 22 2c 20 20 20 20 20 30 2c 20 20 20 30 20  3d",     0,   0 
0c80: 7d 2c 0a 20 20 20 20 7b 20 22 25 73 25 30 33 64  },.    { "%s%03d
0c90: 22 2c 20 20 20 20 20 20 20 20 20 30 2c 20 20 20  ",         0,   
0ca0: 31 20 7d 2c 0a 20 20 20 20 7b 20 22 25 73 2d 6a  1 },.    { "%s-j
0cb0: 6f 75 72 6e 61 6c 25 30 33 64 22 2c 20 53 51 4c  ournal%03d", SQL
0cc0: 49 54 45 5f 4d 55 4c 54 49 50 4c 45 58 5f 4a 4f  ITE_MULTIPLEX_JO
0cd0: 55 52 4e 41 4c 5f 38 5f 33 5f 4f 46 46 53 45 54  URNAL_8_3_OFFSET
0ce0: 2c 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 25 73  , 1 },.    { "%s
0cf0: 2d 77 61 6c 25 30 33 64 22 2c 20 20 20 20 20 53  -wal%03d",     S
0d00: 51 4c 49 54 45 5f 4d 55 4c 54 49 50 4c 45 58 5f  QLITE_MULTIPLEX_
0d10: 57 41 4c 5f 38 5f 33 5f 4f 46 46 53 45 54 2c 20  WAL_8_3_OFFSET, 
0d20: 31 20 7d 2c 0a 20 20 7d 3b 0a 0a 23 69 66 64 65  1 },.  };..#ifde
0d30: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a  f SQLITE_OS_WIN.
0d40: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
0d50: 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
0d60: 73 5f 66 69 6e 64 28 22 77 69 6e 33 32 22 29 3b  s_find("win32");
0d70: 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33  .#else.  sqlite3
0d80: 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 30 3b 0a  _vfs *pVfs = 0;.
0d90: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6c 6c  #endif..  /* All
0da0: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 6c  ocate a buffer l
0db0: 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20  arge enough for 
0dc0: 61 6e 79 20 6f 66 20 74 68 65 20 66 69 6c 65 73  any of the files
0dd0: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
0de0: 0a 20 20 2a 2a 20 64 65 6c 65 74 65 64 2e 20 20  .  ** deleted.  
0df0: 2a 2f 0a 20 20 6e 42 75 66 20 3d 20 28 69 6e 74  */.  nBuf = (int
0e00: 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 20 2b  )strlen(zFile) +
0e10: 20 31 30 30 3b 0a 20 20 7a 42 75 66 20 3d 20 28   100;.  zBuf = (
0e20: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61  char*)sqlite3_ma
0e30: 6c 6c 6f 63 28 6e 42 75 66 29 3b 0a 20 20 69 66  lloc(nBuf);.  if
0e40: 28 20 7a 42 75 66 3d 3d 30 20 29 20 72 65 74 75  ( zBuf==0 ) retu
0e50: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
0e60: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 62 6f  ..  /* Delete bo
0e70: 74 68 20 74 68 65 20 72 65 67 75 6c 61 72 20 61  th the regular a
0e80: 6e 64 20 38 2e 33 20 66 69 6c 65 6e 61 6d 65 73  nd 8.3 filenames
0e90: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
0ea0: 20 64 61 74 61 62 61 73 65 2c 0a 20 20 2a 2a 20   database,.  ** 
0eb0: 6a 6f 75 72 6e 61 6c 2c 20 77 61 6c 20 61 6e 64  journal, wal and
0ec0: 20 73 68 6d 20 66 69 6c 65 73 2e 20 20 2a 2f 0a   shm files.  */.
0ed0: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 30    for(i=0; rc==0
0ee0: 20 26 26 20 69 3c 73 69 7a 65 6f 66 28 61 7a 46   && i<sizeof(azF
0ef0: 6d 74 29 2f 73 69 7a 65 6f 66 28 61 7a 46 6d 74  mt)/sizeof(azFmt
0f00: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
0f10: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
0f20: 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 61 7a 46  (nBuf, zBuf, azF
0f30: 6d 74 5b 69 5d 2c 20 7a 46 69 6c 65 29 3b 0a 20  mt[i], zFile);. 
0f40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 44     rc = sqlite3D
0f50: 65 6c 65 74 65 55 6e 6c 69 6e 6b 49 66 45 78 69  eleteUnlinkIfExi
0f60: 73 74 73 28 70 56 66 73 2c 20 7a 42 75 66 2c 20  sts(pVfs, zBuf, 
0f70: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
0f80: 30 20 26 26 20 69 21 3d 30 20 29 7b 0a 20 20 20  0 && i!=0 ){.   
0f90: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
0fa0: 38 33 4e 61 6d 65 28 7a 42 75 66 29 3b 0a 20 20  83Name(zBuf);.  
0fb0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
0fc0: 44 65 6c 65 74 65 55 6e 6c 69 6e 6b 49 66 45 78  DeleteUnlinkIfEx
0fd0: 69 73 74 73 28 70 56 66 73 2c 20 7a 42 75 66 2c  ists(pVfs, zBuf,
0fe0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   0);.    }.  }..
0ff0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20    /* Delete any 
1000: 6d 75 6c 74 69 70 6c 65 78 6f 72 20 66 69 6c 65  multiplexor file
1010: 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  s */.  for(i=0; 
1020: 72 63 3d 3d 30 20 26 26 20 69 3c 73 69 7a 65 6f  rc==0 && i<sizeo
1030: 66 28 61 4d 46 69 6c 65 29 2f 73 69 7a 65 6f 66  f(aMFile)/sizeof
1040: 28 61 4d 46 69 6c 65 5b 30 5d 29 3b 20 69 2b 2b  (aMFile[0]); i++
1050: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 4d 46  ){.    struct MF
1060: 69 6c 65 20 2a 70 20 3d 20 26 61 4d 46 69 6c 65  ile *p = &aMFile
1070: 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 69 43 68  [i];.    int iCh
1080: 75 6e 6b 3b 0a 20 20 20 20 66 6f 72 28 69 43 68  unk;.    for(iCh
1090: 75 6e 6b 3d 31 3b 20 69 43 68 75 6e 6b 3c 3d 4d  unk=1; iChunk<=M
10a0: 58 5f 43 48 55 4e 4b 5f 4e 55 4d 42 45 52 3b 20  X_CHUNK_NUMBER; 
10b0: 69 43 68 75 6e 6b 2b 2b 29 7b 0a 20 20 20 20 20  iChunk++){.     
10c0: 20 69 6e 74 20 62 45 78 69 73 74 73 3b 0a 20 20   int bExists;.  
10d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
10e0: 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c  intf(nBuf, zBuf,
10f0: 20 70 2d 3e 7a 46 6d 74 2c 20 7a 46 69 6c 65 2c   p->zFmt, zFile,
1100: 20 69 43 68 75 6e 6b 2b 70 2d 3e 69 4f 66 66 73   iChunk+p->iOffs
1110: 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  et);.      if( p
1120: 2d 3e 62 38 33 20 29 20 73 71 6c 69 74 65 33 44  ->b83 ) sqlite3D
1130: 65 6c 65 74 65 38 33 4e 61 6d 65 28 7a 42 75 66  elete83Name(zBuf
1140: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
1150: 6c 69 74 65 33 44 65 6c 65 74 65 55 6e 6c 69 6e  lite3DeleteUnlin
1160: 6b 49 66 45 78 69 73 74 73 28 70 56 66 73 2c 20  kIfExists(pVfs, 
1170: 7a 42 75 66 2c 20 26 62 45 78 69 73 74 73 29 3b  zBuf, &bExists);
1180: 0a 20 20 20 20 20 20 69 66 28 20 62 45 78 69 73  .      if( bExis
1190: 74 73 3d 3d 30 20 7c 7c 20 72 63 21 3d 30 20 29  ts==0 || rc!=0 )
11a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11b0: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  }..  sqlite3_fre
11c0: 65 28 7a 42 75 66 29 3b 0a 20 20 72 65 74 75 72  e(zBuf);.  retur
11d0: 6e 20 28 72 63 20 3f 20 53 51 4c 49 54 45 5f 45  n (rc ? SQLITE_E
11e0: 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  RROR : SQLITE_OK
11f0: 29 3b 0a 7d 0a                                   );.}.