/ Hex Artifact Content
Login

Artifact 8499d4d323f2ec8e28301deb3d6ddd8eef8b8139:


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 20 53  above..*/..#if S
02d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 23 20 20  QLITE_OS_WIN.#  
02e0: 69 6e 63 6c 75 64 65 20 3c 69 6f 2e 68 3e 0a 23  include <io.h>.#
02f0: 20 20 64 65 66 69 6e 65 20 46 5f 4f 4b 20 30 0a    define F_OK 0.
0300: 23 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64 65  #else.#  include
0310: 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 65 6e 64   <unistd.h>.#end
0320: 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72  if.#include <str
0330: 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ing.h>.#include 
0340: 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <errno.h>.#inclu
0350: 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 0a  de "sqlite3.h"..
0360: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
0370: 20 23 64 65 66 69 6e 65 73 20 61 72 65 20 63 6f   #defines are co
0380: 70 69 65 64 20 66 72 6f 6d 20 74 65 73 74 5f 6d  pied from test_m
0390: 75 6c 74 69 70 6c 65 78 2e 63 20 2a 2f 0a 23 69  ultiplex.c */.#i
03a0: 66 6e 64 65 66 20 4d 58 5f 43 48 55 4e 4b 5f 4e  fndef MX_CHUNK_N
03b0: 55 4d 42 45 52 20 0a 23 20 64 65 66 69 6e 65 20  UMBER .# define 
03c0: 4d 58 5f 43 48 55 4e 4b 5f 4e 55 4d 42 45 52 20  MX_CHUNK_NUMBER 
03d0: 32 39 39 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  299.#endif.#ifnd
03e0: 65 66 20 53 51 4c 49 54 45 5f 4d 55 4c 54 49 50  ef SQLITE_MULTIP
03f0: 4c 45 58 5f 4a 4f 55 52 4e 41 4c 5f 38 5f 33 5f  LEX_JOURNAL_8_3_
0400: 4f 46 46 53 45 54 0a 23 20 64 65 66 69 6e 65 20  OFFSET.# define 
0410: 53 51 4c 49 54 45 5f 4d 55 4c 54 49 50 4c 45 58  SQLITE_MULTIPLEX
0420: 5f 4a 4f 55 52 4e 41 4c 5f 38 5f 33 5f 4f 46 46  _JOURNAL_8_3_OFF
0430: 53 45 54 20 34 30 30 0a 23 65 6e 64 69 66 0a 23  SET 400.#endif.#
0440: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d 55  ifndef SQLITE_MU
0450: 4c 54 49 50 4c 45 58 5f 57 41 4c 5f 38 5f 33 5f  LTIPLEX_WAL_8_3_
0460: 4f 46 46 53 45 54 0a 23 20 64 65 66 69 6e 65 20  OFFSET.# define 
0470: 53 51 4c 49 54 45 5f 4d 55 4c 54 49 50 4c 45 58  SQLITE_MULTIPLEX
0480: 5f 57 41 4c 5f 38 5f 33 5f 4f 46 46 53 45 54 20  _WAL_8_3_OFFSET 
0490: 37 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  700.#endif../*.*
04a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
04b0: 73 20 61 20 63 6f 70 79 20 6f 66 20 28 6d 6f 73  s a copy of (mos
04c0: 74 20 6f 66 29 20 74 68 65 20 63 6f 64 65 20 66  t of) the code f
04d0: 72 6f 6d 20 53 51 4c 69 74 65 20 66 75 6e 63 74  rom SQLite funct
04e0: 69 6f 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69  ion.** sqlite3Fi
04f0: 6c 65 53 75 66 66 69 78 33 28 29 2e 20 49 74 20  leSuffix3(). It 
0500: 6d 6f 64 69 66 69 65 73 20 74 68 65 20 66 69 6c  modifies the fil
0510: 65 6e 61 6d 65 20 69 6e 20 62 75 66 66 65 72 20  ename in buffer 
0520: 7a 20 69 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 65  z in the.** same
0530: 20 77 61 79 20 61 73 20 53 51 4c 69 74 65 20 64   way as SQLite d
0540: 6f 65 73 20 77 68 65 6e 20 69 6e 20 38 2e 33 20  oes when in 8.3 
0550: 66 69 6c 65 6e 61 6d 65 73 20 6d 6f 64 65 2e 0a  filenames mode..
0560: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
0570: 71 6c 69 74 65 33 44 65 6c 65 74 65 38 33 4e 61  qlite3Delete83Na
0580: 6d 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  me(char *z){.  i
0590: 6e 74 20 69 2c 20 73 7a 3b 0a 20 20 73 7a 20 3d  nt i, sz;.  sz =
05a0: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29 3b   (int)strlen(z);
05b0: 0a 20 20 66 6f 72 28 69 3d 73 7a 2d 31 3b 20 69  .  for(i=sz-1; i
05c0: 3e 30 20 26 26 20 7a 5b 69 5d 21 3d 27 2f 27 20  >0 && z[i]!='/' 
05d0: 26 26 20 7a 5b 69 5d 21 3d 27 2e 27 3b 20 69 2d  && z[i]!='.'; i-
05e0: 2d 29 7b 7d 0a 20 20 69 66 28 20 7a 5b 69 5d 3d  -){}.  if( z[i]=
05f0: 3d 27 2e 27 20 26 26 20 28 73 7a 3e 69 2b 34 29  ='.' && (sz>i+4)
0600: 20 29 20 6d 65 6d 6d 6f 76 65 28 26 7a 5b 69 2b   ) memmove(&z[i+
0610: 31 5d 2c 20 26 7a 5b 73 7a 2d 33 5d 2c 20 34 29  1], &z[sz-3], 4)
0620: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 7a 46 69 6c 65  ;.}../*.** zFile
0630: 20 69 73 20 61 20 66 69 6c 65 6e 61 6d 65 2e 20   is a filename. 
0640: 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f  Assuming no erro
0650: 72 20 6f 63 63 75 72 73 2c 20 69 66 20 74 68 69  r occurs, if thi
0660: 73 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 0a  s file exists, .
0670: 2a 2a 20 73 65 74 20 2a 70 62 45 78 69 73 74 73  ** set *pbExists
0680: 20 74 6f 20 74 72 75 65 20 61 6e 64 20 75 6e 6c   to true and unl
0690: 69 6e 6b 20 69 74 2e 20 4f 72 2c 20 69 66 20 74  ink it. Or, if t
06a0: 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
06b0: 20 65 78 69 73 74 2c 0a 2a 2a 20 73 65 74 20 2a   exist,.** set *
06c0: 70 62 45 78 69 73 74 73 20 74 6f 20 66 61 6c 73  pbExists to fals
06d0: 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
06e0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
06f0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
0700: 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e 6f  e value of errno
0710: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
0720: 2c 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a  , if no error.**
0730: 20 6f 63 63 75 72 73 2c 20 7a 65 72 6f 20 69 73   occurs, zero is
0740: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
0750: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
0760: 44 65 6c 65 74 65 55 6e 6c 69 6e 6b 49 66 45 78  DeleteUnlinkIfEx
0770: 69 73 74 73 28 63 6f 6e 73 74 20 63 68 61 72 20  ists(const char 
0780: 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 2a 70 62 45  *zFile, int *pbE
0790: 78 69 73 74 73 29 7b 0a 20 20 69 6e 74 20 72 63  xists){.  int rc
07a0: 3b 0a 20 20 72 63 20 3d 20 61 63 63 65 73 73 28  ;.  rc = access(
07b0: 7a 46 69 6c 65 2c 20 46 5f 4f 4b 29 3b 0a 20 20  zFile, F_OK);.  
07c0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
07d0: 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20  ( errno==ENOENT 
07e0: 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 70 62  ){ .      if( pb
07f0: 45 78 69 73 74 73 20 29 20 2a 70 62 45 78 69 73  Exists ) *pbExis
0800: 74 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ts = 0;.      re
0810: 74 75 72 6e 20 30 3b 20 0a 20 20 20 20 7d 0a 20  turn 0; .    }. 
0820: 20 20 20 72 65 74 75 72 6e 20 65 72 72 6e 6f 3b     return errno;
0830: 0a 20 20 7d 0a 20 20 69 66 28 20 70 62 45 78 69  .  }.  if( pbExi
0840: 73 74 73 20 29 20 2a 70 62 45 78 69 73 74 73 20  sts ) *pbExists 
0850: 3d 20 31 3b 0a 20 20 72 63 20 3d 20 75 6e 6c 69  = 1;.  rc = unli
0860: 6e 6b 28 7a 46 69 6c 65 29 3b 0a 20 20 69 66 28  nk(zFile);.  if(
0870: 20 72 63 20 29 20 72 65 74 75 72 6e 20 65 72 72   rc ) return err
0880: 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  no;.  return 0;.
0890: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
08a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
08b0: 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
08c0: 74 68 65 20 73 74 72 69 6e 67 20 61 72 67 75 6d  the string argum
08d0: 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
08e0: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  is.** function. 
08f0: 54 68 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20  The string must 
0900: 63 6f 6e 74 61 69 6e 20 61 20 66 69 6c 65 6e 61  contain a filena
0910: 6d 65 2c 20 6e 6f 74 20 61 6e 20 53 51 4c 69 74  me, not an SQLit
0920: 65 20 55 52 49 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e URI..*/.int sq
0930: 6c 69 74 65 33 5f 64 65 6c 65 74 65 5f 64 61 74  lite3_delete_dat
0940: 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63  abase(.  const c
0950: 68 61 72 20 2a 7a 46 69 6c 65 20 20 20 20 20 20  har *zFile      
0960: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
0970: 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 29 7b   to delete */.){
0980: 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 20 20  .  char *zBuf;  
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09a0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
09b0: 73 70 72 69 6e 74 66 28 29 20 66 69 6c 65 6e 61  sprintf() filena
09c0: 6d 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  mes to */.  int 
09d0: 6e 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  nBuf;           
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
09f0: 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 69 6e  ize of buffer in
0a00: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
0a10: 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
0a30: 79 73 74 65 6d 20 65 72 72 6f 72 20 63 6f 64 65  ystem error code
0a40: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65        /* Iterate
0a70: 20 74 68 72 6f 75 67 68 20 61 7a 46 6d 74 5b 5d   through azFmt[]
0a80: 20 61 6e 64 20 61 4d 46 69 6c 65 5b 5d 20 2a 2f   and aMFile[] */
0a90: 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
0aa0: 61 7a 46 6d 74 5b 5d 20 3d 20 7b 20 22 25 73 22  azFmt[] = { "%s"
0ab0: 2c 20 22 25 73 2d 6a 6f 75 72 6e 61 6c 22 2c 20  , "%s-journal", 
0ac0: 22 25 73 2d 77 61 6c 22 2c 20 22 25 73 2d 73 68  "%s-wal", "%s-sh
0ad0: 6d 22 20 7d 3b 0a 0a 20 20 73 74 72 75 63 74 20  m" };..  struct 
0ae0: 4d 46 69 6c 65 20 7b 0a 20 20 20 20 63 6f 6e 73  MFile {.    cons
0af0: 74 20 63 68 61 72 20 2a 7a 46 6d 74 3b 0a 20 20  t char *zFmt;.  
0b00: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
0b10: 20 20 20 69 6e 74 20 62 38 33 3b 0a 20 20 7d 20     int b83;.  } 
0b20: 61 4d 46 69 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20  aMFile[] = {.   
0b30: 20 7b 20 22 25 73 25 30 33 64 22 2c 20 20 20 20   { "%s%03d",    
0b40: 20 20 20 20 20 30 2c 20 20 20 30 20 7d 2c 0a 20       0,   0 },. 
0b50: 20 20 20 7b 20 22 25 73 2d 6a 6f 75 72 6e 61 6c     { "%s-journal
0b60: 25 30 33 64 22 2c 20 30 2c 20 20 20 30 20 7d 2c  %03d", 0,   0 },
0b70: 0a 20 20 20 20 7b 20 22 25 73 2d 77 61 6c 25 30  .    { "%s-wal%0
0b80: 33 64 22 2c 20 20 20 20 20 30 2c 20 20 20 30 20  3d",     0,   0 
0b90: 7d 2c 0a 20 20 20 20 7b 20 22 25 73 25 30 33 64  },.    { "%s%03d
0ba0: 22 2c 20 20 20 20 20 20 20 20 20 30 2c 20 20 20  ",         0,   
0bb0: 31 20 7d 2c 0a 20 20 20 20 7b 20 22 25 73 2d 6a  1 },.    { "%s-j
0bc0: 6f 75 72 6e 61 6c 25 30 33 64 22 2c 20 53 51 4c  ournal%03d", SQL
0bd0: 49 54 45 5f 4d 55 4c 54 49 50 4c 45 58 5f 4a 4f  ITE_MULTIPLEX_JO
0be0: 55 52 4e 41 4c 5f 38 5f 33 5f 4f 46 46 53 45 54  URNAL_8_3_OFFSET
0bf0: 2c 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 25 73  , 1 },.    { "%s
0c00: 2d 77 61 6c 25 30 33 64 22 2c 20 20 20 20 20 53  -wal%03d",     S
0c10: 51 4c 49 54 45 5f 4d 55 4c 54 49 50 4c 45 58 5f  QLITE_MULTIPLEX_
0c20: 57 41 4c 5f 38 5f 33 5f 4f 46 46 53 45 54 2c 20  WAL_8_3_OFFSET, 
0c30: 31 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 2f 2a 20  1 },.  };..  /* 
0c40: 41 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65  Allocate a buffe
0c50: 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  r large enough f
0c60: 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69  or any of the fi
0c70: 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  les that need to
0c80: 20 62 65 0a 20 20 2a 2a 20 64 65 6c 65 74 65 64   be.  ** deleted
0c90: 2e 20 20 2a 2f 0a 20 20 6e 42 75 66 20 3d 20 28  .  */.  nBuf = (
0ca0: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65  int)strlen(zFile
0cb0: 29 20 2b 20 31 30 30 3b 0a 20 20 7a 42 75 66 20  ) + 100;.  zBuf 
0cc0: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
0cd0: 5f 6d 61 6c 6c 6f 63 28 6e 42 75 66 29 3b 0a 20  _malloc(nBuf);. 
0ce0: 20 69 66 28 20 7a 42 75 66 3d 3d 30 20 29 20 72   if( zBuf==0 ) r
0cf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
0d00: 45 4d 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  EM;..  /* Delete
0d10: 20 62 6f 74 68 20 74 68 65 20 72 65 67 75 6c 61   both the regula
0d20: 72 20 61 6e 64 20 38 2e 33 20 66 69 6c 65 6e 61  r and 8.3 filena
0d30: 6d 65 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  mes versions of 
0d40: 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 20 20  the database,.  
0d50: 2a 2a 20 6a 6f 75 72 6e 61 6c 2c 20 77 61 6c 20  ** journal, wal 
0d60: 61 6e 64 20 73 68 6d 20 66 69 6c 65 73 2e 20 20  and shm files.  
0d70: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  */.  for(i=0; rc
0d80: 3d 3d 30 20 26 26 20 69 3c 73 69 7a 65 6f 66 28  ==0 && i<sizeof(
0d90: 61 7a 46 6d 74 29 2f 73 69 7a 65 6f 66 28 61 7a  azFmt)/sizeof(az
0da0: 46 6d 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Fmt[0]); i++){. 
0db0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
0dc0: 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20  ntf(nBuf, zBuf, 
0dd0: 61 7a 46 6d 74 5b 69 5d 2c 20 7a 46 69 6c 65 29  azFmt[i], zFile)
0de0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
0df0: 65 33 44 65 6c 65 74 65 55 6e 6c 69 6e 6b 49 66  e3DeleteUnlinkIf
0e00: 45 78 69 73 74 73 28 7a 42 75 66 2c 20 30 29 3b  Exists(zBuf, 0);
0e10: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 26  .    if( rc==0 &
0e20: 26 20 69 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  & i!=0 ){.      
0e30: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 38 33 4e  sqlite3Delete83N
0e40: 61 6d 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ame(zBuf);.     
0e50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 44 65 6c   rc = sqlite3Del
0e60: 65 74 65 55 6e 6c 69 6e 6b 49 66 45 78 69 73 74  eteUnlinkIfExist
0e70: 73 28 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20  s(zBuf, 0);.    
0e80: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  }.  }..  /* Dele
0e90: 74 65 20 61 6e 79 20 6d 75 6c 74 69 70 6c 65 78  te any multiplex
0ea0: 6f 72 20 66 69 6c 65 73 20 2a 2f 0a 20 20 66 6f  or files */.  fo
0eb0: 72 28 69 3d 30 3b 20 72 63 3d 3d 30 20 26 26 20  r(i=0; rc==0 && 
0ec0: 69 3c 73 69 7a 65 6f 66 28 61 4d 46 69 6c 65 29  i<sizeof(aMFile)
0ed0: 2f 73 69 7a 65 6f 66 28 61 4d 46 69 6c 65 5b 30  /sizeof(aMFile[0
0ee0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  ]); i++){.    st
0ef0: 72 75 63 74 20 4d 46 69 6c 65 20 2a 70 20 3d 20  ruct MFile *p = 
0f00: 26 61 4d 46 69 6c 65 5b 69 5d 3b 0a 20 20 20 20  &aMFile[i];.    
0f10: 69 6e 74 20 69 43 68 75 6e 6b 3b 0a 20 20 20 20  int iChunk;.    
0f20: 66 6f 72 28 69 43 68 75 6e 6b 3d 31 3b 20 69 43  for(iChunk=1; iC
0f30: 68 75 6e 6b 3c 3d 4d 58 5f 43 48 55 4e 4b 5f 4e  hunk<=MX_CHUNK_N
0f40: 55 4d 42 45 52 3b 20 69 43 68 75 6e 6b 2b 2b 29  UMBER; iChunk++)
0f50: 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 45 78 69  {.      int bExi
0f60: 73 74 73 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sts;.      sqlit
0f70: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
0f80: 2c 20 7a 42 75 66 2c 20 70 2d 3e 7a 46 6d 74 2c  , zBuf, p->zFmt,
0f90: 20 7a 46 69 6c 65 2c 20 69 43 68 75 6e 6b 2b 70   zFile, iChunk+p
0fa0: 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  ->iOffset);.    
0fb0: 20 20 69 66 28 20 70 2d 3e 62 38 33 20 29 20 73    if( p->b83 ) s
0fc0: 71 6c 69 74 65 33 44 65 6c 65 74 65 38 33 4e 61  qlite3Delete83Na
0fd0: 6d 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  me(zBuf);.      
0fe0: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 65 6c 65  rc = sqlite3Dele
0ff0: 74 65 55 6e 6c 69 6e 6b 49 66 45 78 69 73 74 73  teUnlinkIfExists
1000: 28 7a 42 75 66 2c 20 26 62 45 78 69 73 74 73 29  (zBuf, &bExists)
1010: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 45 78 69  ;.      if( bExi
1020: 73 74 73 3d 3d 30 20 7c 7c 20 72 63 21 3d 30 20  sts==0 || rc!=0 
1030: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
1040: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
1050: 65 65 28 7a 42 75 66 29 3b 0a 20 20 72 65 74 75  ee(zBuf);.  retu
1060: 72 6e 20 28 72 63 20 3f 20 53 51 4c 49 54 45 5f  rn (rc ? SQLITE_
1070: 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 4f  ERROR : SQLITE_O
1080: 4b 29 3b 0a 7d 0a                                K);.}.