/ Hex Artifact Content
Login

Artifact ae8b5d2cdb4fa7dd11313059984be9457fa77f63:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 31 39 39 39 2c 20 32 30 30 30 20 44  (c) 1999, 2000 D
0020: 2e 20 52 69 63 68 61 72 64 20 48 69 70 70 0a 2a  . Richard Hipp.*
0030: 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61  *.** This progra
0040: 6d 20 69 73 20 66 72 65 65 20 73 6f 66 74 77 61  m is free softwa
0050: 72 65 3b 20 79 6f 75 20 63 61 6e 20 72 65 64 69  re; you can redi
0060: 73 74 72 69 62 75 74 65 20 69 74 20 61 6e 64 2f  stribute it and/
0070: 6f 72 0a 2a 2a 20 6d 6f 64 69 66 79 20 69 74 20  or.** modify it 
0080: 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d 73 20  under the terms 
0090: 6f 66 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72  of the GNU Gener
00a0: 61 6c 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63  al Public.** Lic
00b0: 65 6e 73 65 20 61 73 20 70 75 62 6c 69 73 68 65  ense as publishe
00c0: 64 20 62 79 20 74 68 65 20 46 72 65 65 20 53 6f  d by the Free So
00d0: 66 74 77 61 72 65 20 46 6f 75 6e 64 61 74 69 6f  ftware Foundatio
00e0: 6e 3b 20 65 69 74 68 65 72 0a 2a 2a 20 76 65 72  n; either.** ver
00f0: 73 69 6f 6e 20 32 20 6f 66 20 74 68 65 20 4c 69  sion 2 of the Li
0100: 63 65 6e 73 65 2c 20 6f 72 20 28 61 74 20 79 6f  cense, or (at yo
0110: 75 72 20 6f 70 74 69 6f 6e 29 20 61 6e 79 20 6c  ur option) any l
0120: 61 74 65 72 20 76 65 72 73 69 6f 6e 2e 0a 2a 2a  ater version..**
0130: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d  .** This program
0140: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
0150: 69 6e 20 74 68 65 20 68 6f 70 65 20 74 68 61 74  in the hope that
0160: 20 69 74 20 77 69 6c 6c 20 62 65 20 75 73 65 66   it will be usef
0170: 75 6c 2c 0a 2a 2a 20 62 75 74 20 57 49 54 48 4f  ul,.** but WITHO
0180: 55 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b  UT ANY WARRANTY;
0190: 20 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68   without even th
01a0: 65 20 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e  e implied warran
01b0: 74 79 20 6f 66 0a 2a 2a 20 4d 45 52 43 48 41 4e  ty of.** MERCHAN
01c0: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
01d0: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
01e0: 55 4c 41 52 20 50 55 52 50 4f 53 45 2e 20 20 53  ULAR PURPOSE.  S
01f0: 65 65 20 74 68 65 20 47 4e 55 0a 2a 2a 20 47 65  ee the GNU.** Ge
0200: 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63  neral Public Lic
0210: 65 6e 73 65 20 66 6f 72 20 6d 6f 72 65 20 64 65  ense for more de
0220: 74 61 69 6c 73 2e 0a 2a 2a 20 0a 2a 2a 20 59 6f  tails..** .** Yo
0230: 75 20 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65  u should have re
0240: 63 65 69 76 65 64 20 61 20 63 6f 70 79 20 6f 66  ceived a copy of
0250: 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61 6c   the GNU General
0260: 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e   Public.** Licen
0270: 73 65 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  se along with th
0280: 69 73 20 6c 69 62 72 61 72 79 3b 20 69 66 20 6e  is library; if n
0290: 6f 74 2c 20 77 72 69 74 65 20 74 6f 20 74 68 65  ot, write to the
02a0: 0a 2a 2a 20 46 72 65 65 20 53 6f 66 74 77 61 72  .** Free Softwar
02b0: 65 20 46 6f 75 6e 64 61 74 69 6f 6e 2c 20 49 6e  e Foundation, In
02c0: 63 2e 2c 20 35 39 20 54 65 6d 70 6c 65 20 50 6c  c., 59 Temple Pl
02d0: 61 63 65 20 2d 20 53 75 69 74 65 20 33 33 30 2c  ace - Suite 330,
02e0: 0a 2a 2a 20 42 6f 73 74 6f 6e 2c 20 4d 41 20 20  .** Boston, MA  
02f0: 30 32 31 31 31 2d 31 33 30 37 2c 20 55 53 41 2e  02111-1307, USA.
0300: 0a 2a 2a 0a 2a 2a 20 41 75 74 68 6f 72 20 63 6f  .**.** Author co
0310: 6e 74 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  ntact informatio
0320: 6e 3a 0a 2a 2a 20 20 20 64 72 68 40 68 77 61 63  n:.**   drh@hwac
0330: 69 2e 63 6f 6d 0a 2a 2a 20 20 20 68 74 74 70 3a  i.com.**   http:
0340: 2f 2f 77 77 77 2e 68 77 61 63 69 2e 63 6f 6d 2f  //www.hwaci.com/
0350: 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  drh/.**.********
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03a0: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
03b0: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 74 6f 20  ontains code to 
03c0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 64 61  implement the da
03d0: 74 61 62 61 73 65 20 62 61 73 65 65 6e 64 20 28  tabase baseend (
03e0: 44 42 42 45 29 0a 2a 2a 20 66 6f 72 20 73 71 6c  DBBE).** for sql
03f0: 69 74 65 2e 20 20 54 68 65 20 64 61 74 61 62 61  ite.  The databa
0400: 73 65 20 62 61 63 6b 65 6e 64 20 69 73 20 74 68  se backend is th
0410: 65 20 69 6e 74 65 72 66 61 63 65 20 62 65 74 77  e interface betw
0420: 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 20 61 6e  een.** sqlite an
0430: 64 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  d the code that 
0440: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 6c  does the actuall
0450: 79 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72  y reading and wr
0460: 69 74 69 6e 67 0a 2a 2a 20 6f 66 20 69 6e 66 6f  iting.** of info
0470: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 64  rmation to the d
0480: 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  isk..**.** This 
0490: 66 69 6c 65 20 75 73 65 73 20 47 44 42 4d 20 61  file uses GDBM a
04a0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  s the database b
04b0: 61 63 6b 65 6e 64 2e 20 20 49 74 20 73 68 6f 75  ackend.  It shou
04c0: 6c 64 20 62 65 0a 2a 2a 20 72 65 6c 61 74 69 76  ld be.** relativ
04d0: 65 6c 79 20 73 69 6d 70 6c 65 20 74 6f 20 63 6f  ely simple to co
04e0: 6e 76 65 72 74 20 74 6f 20 61 20 64 69 66 66 65  nvert to a diffe
04f0: 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 75  rent database su
0500: 63 68 0a 2a 2a 20 61 73 20 4e 44 42 4d 2c 20 53  ch.** as NDBM, S
0510: 44 42 4d 2c 20 6f 72 20 42 65 72 6b 65 6c 65 79  DBM, or Berkeley
0520: 44 42 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 64  DB..**.** $Id: d
0530: 62 62 65 2e 63 2c 76 20 31 2e 31 31 20 32 30 30  bbe.c,v 1.11 200
0540: 30 2f 30 36 2f 30 32 20 31 33 3a 32 37 3a 35 39  0/06/02 13:27:59
0550: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
0560: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0570: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 67  t.h".#include <g
0580: 64 62 6d 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  dbm.h>.#include 
0590: 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e  <sys/stat.h>.#in
05a0: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
05b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65  .#include <ctype
05c0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69  .h>.#include <ti
05d0: 6d 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  me.h>../*.** Eac
05e0: 68 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  h open database 
05f0: 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 73 74 61  file is an insta
0600: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
0610: 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  cture..*/.typede
0620: 66 20 73 74 72 75 63 74 20 42 65 46 69 6c 65 20  f struct BeFile 
0630: 42 65 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 42  BeFile;.struct B
0640: 65 46 69 6c 65 20 7b 0a 20 20 63 68 61 72 20 2a  eFile {.  char *
0650: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
0660: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
0670: 20 66 69 6c 65 20 2a 2f 0a 20 20 47 44 42 4d 5f   file */.  GDBM_
0680: 46 49 4c 45 20 64 62 66 3b 20 20 20 20 20 20 20  FILE dbf;       
0690: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 69     /* The file i
06a0: 74 73 65 6c 66 20 2a 2f 0a 20 20 69 6e 74 20 6e  tself */.  int n
06b0: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
06c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
06d0: 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20 20  references */.  
06e0: 69 6e 74 20 64 65 6c 4f 6e 43 6c 6f 73 65 3b 20  int delOnClose; 
06f0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
0700: 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a  e when closing *
0710: 2f 0a 20 20 69 6e 74 20 77 72 69 74 65 61 62 6c  /.  int writeabl
0720: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  e;          /* O
0730: 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e  pened for writin
0740: 67 20 2a 2f 0a 20 20 42 65 46 69 6c 65 20 2a 70  g */.  BeFile *p
0750: 4e 65 78 74 2c 20 2a 70 50 72 65 76 3b 20 20 2f  Next, *pPrev;  /
0760: 2a 20 4e 65 78 74 20 61 6e 64 20 70 72 65 76 69  * Next and previ
0770: 6f 75 73 20 6f 6e 20 6c 69 73 74 20 6f 66 20 6f  ous on list of o
0780: 70 65 6e 20 66 69 6c 65 73 20 2a 2f 0a 7d 3b 0a  pen files */.};.
0790: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
07a0: 77 69 6e 67 20 61 72 65 20 73 74 61 74 65 20 76  wing are state v
07b0: 61 72 69 61 62 6c 65 73 20 66 6f 72 20 74 68 65  ariables for the
07c0: 20 52 43 34 20 61 6c 67 6f 72 69 74 68 6d 2e 20   RC4 algorithm. 
07d0: 20 57 65 0a 2a 2a 20 75 73 65 20 52 43 34 20 61   We.** use RC4 a
07e0: 73 20 61 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65  s a random numbe
07f0: 72 20 67 65 6e 65 72 61 74 6f 72 2e 20 20 45 61  r generator.  Ea
0800: 63 68 20 63 61 6c 6c 20 74 6f 20 52 43 34 20 67  ch call to RC4 g
0810: 69 76 65 73 0a 2a 2a 20 61 20 72 61 6e 64 6f 6d  ives.** a random
0820: 20 38 2d 62 69 74 20 6e 75 6d 62 65 72 2e 0a 2a   8-bit number..*
0830: 2f 0a 73 74 72 75 63 74 20 72 63 34 20 7b 0a 20  /.struct rc4 {. 
0840: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
0850: 20 73 5b 32 35 36 5d 3b 0a 7d 3b 0a 0a 2f 2a 0a   s[256];.};../*.
0860: 2a 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  ** The complete 
0870: 64 61 74 61 62 61 73 65 20 69 73 20 61 6e 20 69  database is an i
0880: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0890: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
08a0: 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 44 62  re..*/.struct Db
08b0: 62 65 20 7b 0a 20 20 63 68 61 72 20 2a 7a 44 69  be {.  char *zDi
08c0: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r;        /* The
08d0: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
08e0: 69 6e 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ining the databa
08f0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 77 72 69 74  se */.  int writ
0900: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  e;         /* Tr
0910: 75 65 20 66 6f 72 20 77 72 69 74 65 20 70 65 72  ue for write per
0920: 6d 69 73 73 69 6f 6e 20 2a 2f 0a 20 20 42 65 46  mission */.  BeF
0930: 69 6c 65 20 2a 70 4f 70 65 6e 3b 20 20 20 20 20  ile *pOpen;     
0940: 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70 65 6e 20  /* List of open 
0950: 66 69 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  files */.  int n
0960: 54 65 6d 70 3b 20 20 20 20 20 20 20 20 20 2f 2a  Temp;         /*
0970: 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 6d 70 6f   Number of tempo
0980: 72 61 72 79 20 66 69 6c 65 73 20 63 72 65 61 74  rary files creat
0990: 65 64 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 2a 61  ed */.  FILE **a
09a0: 70 54 65 6d 70 3b 20 20 20 20 20 2f 2a 20 53 70  pTemp;     /* Sp
09b0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 65 6d 70  ace to hold temp
09c0: 6f 72 61 72 79 20 66 69 6c 65 20 70 6f 69 6e 74  orary file point
09d0: 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ers */.  char **
09e0: 61 7a 54 65 6d 70 3b 20 20 20 20 20 2f 2a 20 4e  azTemp;     /* N
09f0: 61 6d 65 73 20 6f 66 20 74 68 65 20 74 65 6d 70  ames of the temp
0a00: 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 20  orary files */. 
0a10: 20 73 74 72 75 63 74 20 72 63 34 20 72 63 34 3b   struct rc4 rc4;
0a20: 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f      /* The rando
0a30: 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74  m number generat
0a40: 6f 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  or */.};../*.** 
0a50: 45 61 63 68 20 66 69 6c 65 20 77 69 74 68 69 6e  Each file within
0a60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
0a70: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
0a80: 74 68 69 73 0a 2a 2a 20 73 74 72 75 63 74 75 72  this.** structur
0a90: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 44 62 62  e..*/.struct Dbb
0aa0: 65 54 61 62 6c 65 20 7b 0a 20 20 44 62 62 65 20  eTable {.  Dbbe 
0ab0: 2a 70 42 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  *pBe;         /*
0ac0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 66   The database of
0ad0: 20 77 68 69 63 68 20 74 68 69 73 20 72 65 63 6f   which this reco
0ae0: 72 64 20 69 73 20 61 20 70 61 72 74 20 2a 2f 0a  rd is a part */.
0af0: 20 20 42 65 46 69 6c 65 20 2a 70 46 69 6c 65 3b    BeFile *pFile;
0b00: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
0b10: 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
0b20: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 64 61  is table */.  da
0b30: 74 75 6d 20 6b 65 79 3b 20 20 20 20 20 20 20 20  tum key;        
0b40: 20 2f 2a 20 4d 6f 73 74 20 72 65 63 65 6e 74 6c   /* Most recentl
0b50: 79 20 75 73 65 64 20 6b 65 79 20 2a 2f 0a 20 20  y used key */.  
0b60: 64 61 74 75 6d 20 64 61 74 61 3b 20 20 20 20 20  datum data;     
0b70: 20 20 20 2f 2a 20 4d 6f 73 74 20 72 65 63 65 6e     /* Most recen
0b80: 74 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  t data */.  int 
0b90: 6e 65 65 64 52 65 77 69 6e 64 3b 20 20 20 20 2f  needRewind;    /
0ba0: 2a 20 4e 65 78 74 20 6b 65 79 20 73 68 6f 75 6c  * Next key shoul
0bb0: 64 20 62 65 20 74 68 65 20 66 69 72 73 74 20 2a  d be the first *
0bc0: 2f 0a 20 20 69 6e 74 20 72 65 61 64 50 65 6e 64  /.  int readPend
0bd0: 69 6e 67 3b 20 20 20 2f 2a 20 54 68 65 20 66 65  ing;   /* The fe
0be0: 74 63 68 20 68 61 73 6e 27 74 20 61 63 74 75 61  tch hasn't actua
0bf0: 6c 6c 79 20 62 65 65 6e 20 64 6f 6e 65 20 79 65  lly been done ye
0c00: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  t */.};../*.** I
0c10: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 52 43  nitialize the RC
0c20: 34 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2f 0a  4 algorithm..*/.
0c30: 73 74 61 74 69 63 20 76 6f 69 64 20 72 63 34 69  static void rc4i
0c40: 6e 69 74 28 73 74 72 75 63 74 20 72 63 34 20 2a  nit(struct rc4 *
0c50: 70 2c 20 63 68 61 72 20 2a 6b 65 79 2c 20 69 6e  p, char *key, in
0c60: 74 20 6b 65 79 6c 65 6e 29 7b 0a 20 20 69 6e 74  t keylen){.  int
0c70: 20 69 3b 0a 20 20 63 68 61 72 20 6b 5b 32 35 36   i;.  char k[256
0c80: 5d 3b 0a 20 20 70 2d 3e 6a 20 3d 20 30 3b 0a 20  ];.  p->j = 0;. 
0c90: 20 70 2d 3e 69 20 3d 20 30 3b 0a 20 20 66 6f 72   p->i = 0;.  for
0ca0: 28 69 3d 30 3b 20 69 3c 32 35 36 3b 20 69 2b 2b  (i=0; i<256; i++
0cb0: 29 7b 0a 20 20 20 20 70 2d 3e 73 5b 69 5d 20 3d  ){.    p->s[i] =
0cc0: 20 69 3b 0a 20 20 20 20 6b 5b 69 5d 20 3d 20 6b   i;.    k[i] = k
0cd0: 65 79 5b 69 25 6b 65 79 6c 65 6e 5d 3b 0a 20 20  ey[i%keylen];.  
0ce0: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32  }.  for(i=0; i<2
0cf0: 35 36 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  56; i++){.    in
0d00: 74 20 74 3b 0a 20 20 20 20 70 2d 3e 6a 20 3d 20  t t;.    p->j = 
0d10: 28 70 2d 3e 6a 20 2b 20 70 2d 3e 73 5b 69 5d 20  (p->j + p->s[i] 
0d20: 2b 20 6b 5b 69 5d 29 20 26 20 30 78 66 66 3b 0a  + k[i]) & 0xff;.
0d30: 20 20 20 20 74 20 3d 20 70 2d 3e 73 5b 70 2d 3e      t = p->s[p->
0d40: 6a 5d 3b 0a 20 20 20 20 70 2d 3e 73 5b 70 2d 3e  j];.    p->s[p->
0d50: 6a 5d 20 3d 20 70 2d 3e 73 5b 69 5d 3b 0a 20 20  j] = p->s[i];.  
0d60: 20 20 70 2d 3e 73 5b 69 5d 20 3d 20 74 3b 0a 20    p->s[i] = t;. 
0d70: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20   }.}../*.** Get 
0d80: 61 20 73 69 6e 67 6c 65 20 38 2d 62 69 74 20 72  a single 8-bit r
0d90: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 66 72 6f 6d  andom value from
0da0: 20 74 68 65 20 52 43 34 20 61 6c 67 6f 72 69 74   the RC4 algorit
0db0: 68 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  hm..*/.static in
0dc0: 74 20 72 63 34 62 79 74 65 28 73 74 72 75 63 74  t rc4byte(struct
0dd0: 20 72 63 34 20 2a 70 29 7b 0a 20 20 69 6e 74 20   rc4 *p){.  int 
0de0: 74 3b 0a 20 20 70 2d 3e 69 20 3d 20 28 70 2d 3e  t;.  p->i = (p->
0df0: 69 20 2b 20 31 29 20 26 20 30 78 66 66 3b 0a 20  i + 1) & 0xff;. 
0e00: 20 70 2d 3e 6a 20 3d 20 28 70 2d 3e 6a 20 2b 20   p->j = (p->j + 
0e10: 70 2d 3e 73 5b 70 2d 3e 69 5d 29 20 26 20 30 78  p->s[p->i]) & 0x
0e20: 66 66 3b 0a 20 20 74 20 3d 20 70 2d 3e 73 5b 70  ff;.  t = p->s[p
0e30: 2d 3e 69 5d 3b 0a 20 20 70 2d 3e 73 5b 70 2d 3e  ->i];.  p->s[p->
0e40: 69 5d 20 3d 20 70 2d 3e 73 5b 70 2d 3e 6a 5d 3b  i] = p->s[p->j];
0e50: 0a 20 20 70 2d 3e 73 5b 70 2d 3e 6a 5d 20 3d 20  .  p->s[p->j] = 
0e60: 74 3b 0a 20 20 74 20 3d 20 70 2d 3e 73 5b 70 2d  t;.  t = p->s[p-
0e70: 3e 69 5d 20 2b 20 70 2d 3e 73 5b 70 2d 3e 6a 5d  >i] + p->s[p->j]
0e80: 3b 0a 20 20 72 65 74 75 72 6e 20 74 20 26 20 30  ;.  return t & 0
0e90: 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  xff;.}../*.** Th
0ea0: 69 73 20 72 6f 75 74 69 6e 65 20 6f 70 65 6e 73  is routine opens
0eb0: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 2e   a new database.
0ec0: 20 20 46 6f 72 20 74 68 65 20 47 44 42 4d 20 64    For the GDBM d
0ed0: 72 69 76 65 72 0a 2a 2a 20 69 6d 70 6c 65 6d 65  river.** impleme
0ee0: 6e 74 65 64 20 68 65 72 65 2c 20 74 68 65 20 64  nted here, the d
0ef0: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
0f00: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
0f10: 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 63 6f 6e  directory.** con
0f20: 74 61 69 6e 69 6e 67 20 61 6c 6c 20 74 68 65 20  taining all the 
0f30: 66 69 6c 65 73 20 6f 66 20 74 68 65 20 64 61 74  files of the dat
0f40: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
0f50: 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 70 6f  successful, a po
0f60: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 44 62 62  inter to the Dbb
0f70: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72  e structure is r
0f80: 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 49 66 20 74  eturned..** If t
0f90: 68 65 72 65 20 61 72 65 20 65 72 72 6f 72 73 2c  here are errors,
0fa0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
0fb0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
0fc0: 20 6c 65 66 74 0a 2a 2a 20 69 6e 20 2a 70 7a 45   left.** in *pzE
0fd0: 72 72 4d 73 67 20 61 6e 64 20 4e 55 4c 4c 20 69  rrMsg and NULL i
0fe0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 44  s returned..*/.D
0ff0: 62 62 65 20 2a 73 71 6c 69 74 65 44 62 62 65 4f  bbe *sqliteDbbeO
1000: 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  pen(.  const cha
1010: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
1020: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
1030: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
1040: 6e 74 20 77 72 69 74 65 46 6c 61 67 2c 20 20 20  nt writeFlag,   
1050: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1060: 20 77 65 20 77 69 6c 6c 20 62 65 20 77 72 69 74   we will be writ
1070: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
1080: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 63 72 65  ase */.  int cre
1090: 61 74 65 46 6c 61 67 2c 20 20 20 20 20 20 20 20  ateFlag,        
10a0: 2f 2a 20 54 72 75 65 20 74 6f 20 63 72 65 61 74  /* True to creat
10b0: 65 20 64 61 74 61 62 61 73 65 20 69 66 20 69 74  e database if it
10c0: 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20 2a   doesn't exist *
10d0: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  /.  char **pzErr
10e0: 4d 73 67 20 20 20 20 20 20 20 20 2f 2a 20 57 72  Msg        /* Wr
10f0: 69 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ite error messag
1100: 65 73 20 28 69 66 20 61 6e 79 29 20 68 65 72 65  es (if any) here
1110: 20 2a 2f 0a 29 7b 0a 20 20 44 62 62 65 20 2a 70   */.){.  Dbbe *p
1120: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 73 74  New;.  struct st
1130: 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20 63 68  at statbuf;.  ch
1140: 61 72 20 2a 7a 4d 61 73 74 65 72 3b 0a 0a 20 20  ar *zMaster;..  
1150: 69 66 28 20 21 77 72 69 74 65 46 6c 61 67 20 29  if( !writeFlag )
1160: 20 63 72 65 61 74 65 46 6c 61 67 20 3d 20 30 3b   createFlag = 0;
1170: 0a 20 20 69 66 28 20 73 74 61 74 28 7a 4e 61 6d  .  if( stat(zNam
1180: 65 2c 20 26 73 74 61 74 62 75 66 29 21 3d 30 20  e, &statbuf)!=0 
1190: 29 7b 0a 20 20 20 20 69 66 28 20 63 72 65 61 74  ){.    if( creat
11a0: 65 46 6c 61 67 20 29 20 6d 6b 64 69 72 28 7a 4e  eFlag ) mkdir(zN
11b0: 61 6d 65 2c 20 30 37 35 30 29 3b 0a 20 20 20 20  ame, 0750);.    
11c0: 69 66 28 20 73 74 61 74 28 7a 4e 61 6d 65 2c 20  if( stat(zName, 
11d0: 26 73 74 61 74 62 75 66 29 21 3d 30 20 29 7b 0a  &statbuf)!=0 ){.
11e0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
11f0: 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20  tring(pzErrMsg, 
1200: 63 72 65 61 74 65 46 6c 61 67 20 3f 20 0a 20 20  createFlag ? .  
1210: 20 20 20 20 20 20 20 22 63 61 6e 27 74 20 66 69         "can't fi
1220: 6e 64 20 6f 72 20 63 72 65 61 74 65 20 64 69 72  nd or create dir
1230: 65 63 74 6f 72 79 20 5c 22 22 20 3a 20 22 63 61  ectory \"" : "ca
1240: 6e 27 74 20 66 69 6e 64 20 64 69 72 65 63 74 6f  n't find directo
1250: 72 79 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  ry \"",.        
1260: 20 7a 4e 61 6d 65 2c 20 22 5c 22 22 2c 20 30 29   zName, "\"", 0)
1270: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1280: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1290: 28 20 21 53 5f 49 53 44 49 52 28 73 74 61 74 62  ( !S_ISDIR(statb
12a0: 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 7b 0a 20  uf.st_mode) ){. 
12b0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
12c0: 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 22 6e 6f  ng(pzErrMsg, "no
12d0: 74 20 61 20 64 69 72 65 63 74 6f 72 79 3a 20 5c  t a directory: \
12e0: 22 22 2c 20 7a 4e 61 6d 65 2c 20 22 5c 22 22 2c  "", zName, "\"",
12f0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1300: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 63 63  0;.  }.  if( acc
1310: 65 73 73 28 7a 4e 61 6d 65 2c 20 77 72 69 74 65  ess(zName, write
1320: 46 6c 61 67 20 3f 20 28 58 5f 4f 4b 7c 57 5f 4f  Flag ? (X_OK|W_O
1330: 4b 7c 52 5f 4f 4b 29 20 3a 20 28 58 5f 4f 4b 7c  K|R_OK) : (X_OK|
1340: 52 5f 4f 4b 29 29 20 29 7b 0a 20 20 20 20 73 71  R_OK)) ){.    sq
1350: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 70 7a  liteSetString(pz
1360: 45 72 72 4d 73 67 2c 20 22 61 63 63 65 73 73 20  ErrMsg, "access 
1370: 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65  permission denie
1380: 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  d", 0);.    retu
1390: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  rn 0;.  }.  zMas
13a0: 74 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ter = 0;.  sqlit
13b0: 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4d 61 73  eSetString(&zMas
13c0: 74 65 72 2c 20 7a 4e 61 6d 65 2c 20 22 2f 22 20  ter, zName, "/" 
13d0: 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 30 29 3b  MASTER_NAME, 0);
13e0: 0a 20 20 69 66 28 20 73 74 61 74 28 7a 4d 61 73  .  if( stat(zMas
13f0: 74 65 72 2c 20 26 73 74 61 74 62 75 66 29 3d 3d  ter, &statbuf)==
1400: 30 0a 20 20 20 26 26 20 61 63 63 65 73 73 28 7a  0.   && access(z
1410: 4d 61 73 74 65 72 2c 20 77 72 69 74 65 46 6c 61  Master, writeFla
1420: 67 20 3f 20 28 57 5f 4f 4b 7c 52 5f 4f 4b 29 20  g ? (W_OK|R_OK) 
1430: 3a 20 52 5f 4f 4b 29 21 3d 30 20 29 7b 0a 20 20  : R_OK)!=0 ){.  
1440: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
1450: 67 28 70 7a 45 72 72 4d 73 67 2c 20 22 61 63 63  g(pzErrMsg, "acc
1460: 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 64  ess permission d
1470: 65 6e 69 65 64 20 66 6f 72 20 22 2c 20 7a 4d 61  enied for ", zMa
1480: 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71  ster, 0);.    sq
1490: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
14a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
14b0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
14c0: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 70 4e  e(zMaster);.  pN
14d0: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
14e0: 63 28 73 69 7a 65 6f 66 28 44 62 62 65 29 20 2b  c(sizeof(Dbbe) +
14f0: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b   strlen(zName) +
1500: 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d   1);.  if( pNew=
1510: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1520: 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d  SetString(pzErrM
1530: 73 67 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  sg, "out of memo
1540: 72 79 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ry", 0);.    ret
1550: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
1560: 77 2d 3e 7a 44 69 72 20 3d 20 28 63 68 61 72 2a  w->zDir = (char*
1570: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 74 72  )&pNew[1];.  str
1580: 63 70 79 28 70 4e 65 77 2d 3e 7a 44 69 72 2c 20  cpy(pNew->zDir, 
1590: 7a 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 2d 3e  zName);.  pNew->
15a0: 77 72 69 74 65 20 3d 20 77 72 69 74 65 46 6c 61  write = writeFla
15b0: 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 70 65 6e  g;.  pNew->pOpen
15c0: 20 3d 20 30 3b 0a 20 20 74 69 6d 65 28 26 73 74   = 0;.  time(&st
15d0: 61 74 62 75 66 2e 73 74 5f 63 74 69 6d 65 29 3b  atbuf.st_ctime);
15e0: 0a 20 20 72 63 34 69 6e 69 74 28 26 70 4e 65 77  .  rc4init(&pNew
15f0: 2d 3e 72 63 34 2c 20 28 63 68 61 72 2a 29 26 73  ->rc4, (char*)&s
1600: 74 61 74 62 75 66 2c 20 73 69 7a 65 6f 66 28 73  tatbuf, sizeof(s
1610: 74 61 74 62 75 66 29 29 3b 0a 20 20 72 65 74 75  tatbuf));.  retu
1620: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
1630: 2a 20 43 6f 6d 70 6c 65 74 65 6c 79 20 73 68 75  * Completely shu
1640: 74 64 6f 77 6e 20 74 68 65 20 67 69 76 65 6e 20  tdown the given 
1650: 64 61 74 61 62 61 73 65 2e 20 20 43 6c 6f 73 65  database.  Close
1660: 20 61 6c 6c 20 66 69 6c 65 73 2e 20 20 46 72 65   all files.  Fre
1670: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  e all memory..*/
1680: 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 62 62 65  .void sqliteDbbe
1690: 43 6c 6f 73 65 28 44 62 62 65 20 2a 70 42 65 29  Close(Dbbe *pBe)
16a0: 7b 0a 20 20 42 65 46 69 6c 65 20 2a 70 46 69 6c  {.  BeFile *pFil
16b0: 65 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74  e, *pNext;.  int
16c0: 20 69 3b 0a 20 20 66 6f 72 28 70 46 69 6c 65 3d   i;.  for(pFile=
16d0: 70 42 65 2d 3e 70 4f 70 65 6e 3b 20 70 46 69 6c  pBe->pOpen; pFil
16e0: 65 3b 20 70 46 69 6c 65 3d 70 4e 65 78 74 29 7b  e; pFile=pNext){
16f0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 46 69  .    pNext = pFi
1700: 6c 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 67  le->pNext;.    g
1710: 64 62 6d 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2d  dbm_close(pFile-
1720: 3e 64 62 66 29 3b 0a 20 20 20 20 6d 65 6d 73 65  >dbf);.    memse
1730: 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
1740: 6f 66 28 2a 70 46 69 6c 65 29 29 3b 20 20 20 0a  of(*pFile));   .
1750: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
1760: 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  File);.  }.  for
1770: 28 69 3d 30 3b 20 69 3c 70 42 65 2d 3e 6e 54 65  (i=0; i<pBe->nTe
1780: 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  mp; i++){.    if
1790: 28 20 70 42 65 2d 3e 61 70 54 65 6d 70 5b 69 5d  ( pBe->apTemp[i]
17a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c  !=0 ){.      unl
17b0: 69 6e 6b 28 70 42 65 2d 3e 61 7a 54 65 6d 70 5b  ink(pBe->azTemp[
17c0: 69 5d 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73  i]);.      fclos
17d0: 65 28 70 42 65 2d 3e 61 70 54 65 6d 70 5b 69 5d  e(pBe->apTemp[i]
17e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
17f0: 72 65 65 28 70 42 65 2d 3e 61 7a 54 65 6d 70 5b  ree(pBe->azTemp[
1800: 69 5d 29 3b 0a 20 20 20 20 20 20 70 42 65 2d 3e  i]);.      pBe->
1810: 61 70 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20  apTemp[i] = 0;. 
1820: 20 20 20 20 20 70 42 65 2d 3e 61 7a 54 65 6d 70       pBe->azTemp
1830: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  [i] = 0;.      b
1840: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1850: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 42 65    sqliteFree(pBe
1860: 2d 3e 61 7a 54 65 6d 70 29 3b 0a 20 20 73 71 6c  ->azTemp);.  sql
1870: 69 74 65 46 72 65 65 28 70 42 65 2d 3e 61 70 54  iteFree(pBe->apT
1880: 65 6d 70 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  emp);.  memset(p
1890: 42 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  Be, 0, sizeof(*p
18a0: 42 65 29 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  Be));.  sqliteFr
18b0: 65 65 28 70 42 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ee(pBe);.}../*.*
18c0: 2a 20 54 72 61 6e 73 6c 61 74 65 20 74 68 65 20  * Translate the 
18d0: 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  name of a table 
18e0: 69 6e 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66  into the name of
18f0: 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 6f 6c   a file that hol
1900: 64 73 0a 2a 2a 20 74 68 61 74 20 74 61 62 6c 65  ds.** that table
1910: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
1920: 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 69 73   the filename is
1930: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
1940: 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  * sqliteMalloc()
1950: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
1960: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
1970: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
1980: 74 61 74 69 63 20 63 68 61 72 20 2a 73 71 6c 69  tatic char *sqli
1990: 74 65 46 69 6c 65 4f 66 54 61 62 6c 65 28 44 62  teFileOfTable(Db
19a0: 62 65 20 2a 70 42 65 2c 20 63 6f 6e 73 74 20 63  be *pBe, const c
19b0: 68 61 72 20 2a 7a 54 61 62 6c 65 29 7b 0a 20 20  har *zTable){.  
19c0: 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 30 3b  char *zFile = 0;
19d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
19e0: 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 46 69  teSetString(&zFi
19f0: 6c 65 2c 20 70 42 65 2d 3e 7a 44 69 72 2c 20 22  le, pBe->zDir, "
1a00: 2f 22 2c 20 7a 54 61 62 6c 65 2c 20 22 2e 74 62  /", zTable, ".tb
1a10: 6c 22 2c 20 30 29 3b 0a 20 20 69 66 28 20 7a 46  l", 0);.  if( zF
1a20: 69 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ile==0 ) return 
1a30: 30 3b 0a 20 20 66 6f 72 28 69 3d 73 74 72 6c 65  0;.  for(i=strle
1a40: 6e 28 70 42 65 2d 3e 7a 44 69 72 29 2b 31 3b 20  n(pBe->zDir)+1; 
1a50: 7a 46 69 6c 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  zFile[i]; i++){.
1a60: 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 46 69 6c      int c = zFil
1a70: 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69 73  e[i];.    if( is
1a80: 75 70 70 65 72 28 63 29 20 29 7b 0a 20 20 20 20  upper(c) ){.    
1a90: 20 20 7a 46 69 6c 65 5b 69 5d 20 3d 20 74 6f 6c    zFile[i] = tol
1aa0: 6f 77 65 72 28 63 29 3b 0a 20 20 20 20 7d 65 6c  ower(c);.    }el
1ab0: 73 65 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28  se if( !isalnum(
1ac0: 63 29 20 26 26 20 63 21 3d 27 2d 27 20 26 26 20  c) && c!='-' && 
1ad0: 63 21 3d 27 5f 27 20 26 26 20 63 21 3d 27 2e 27  c!='_' && c!='.'
1ae0: 20 29 7b 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b   ){.      zFile[
1af0: 69 5d 20 3d 20 27 2b 27 3b 0a 20 20 20 20 7d 0a  i] = '+';.    }.
1b00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69    }.  return zFi
1b10: 6c 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  le;.}../*.** Gen
1b20: 65 72 61 74 65 20 61 20 72 61 6e 64 6f 6d 20 66  erate a random f
1b30: 69 6c 65 6e 61 6d 65 20 77 69 74 68 20 74 68 65  ilename with the
1b40: 20 67 69 76 65 6e 20 70 72 65 66 69 78 2e 0a 2a   given prefix..*
1b50: 2a 0a 2a 2a 20 56 65 72 79 20 72 61 6e 64 6f 6d  *.** Very random
1b60: 20 6e 61 6d 65 73 20 61 72 65 20 63 68 6f 73 65   names are chose
1b70: 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 68  n so that the ch
1b80: 61 6e 63 65 20 6f 66 20 61 0a 2a 2a 20 63 6f 6c  ance of a.** col
1b90: 6c 69 73 69 6f 6e 20 77 69 74 68 20 61 6e 20 65  lision with an e
1ba0: 78 69 73 74 69 6e 67 20 66 69 6c 65 6e 61 6d 65  xisting filename
1bb0: 20 69 73 20 76 65 72 79 20 76 65 72 79 20 73 6d   is very very sm
1bc0: 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  all..*/.static v
1bd0: 6f 69 64 20 72 61 6e 64 6f 6d 4e 61 6d 65 28 73  oid randomName(s
1be0: 74 72 75 63 74 20 72 63 34 20 2a 70 52 63 34 2c  truct rc4 *pRc4,
1bf0: 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 63 68 61   char *zBuf, cha
1c00: 72 20 2a 7a 50 72 65 66 69 78 29 7b 0a 20 20 69  r *zPrefix){.  i
1c10: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 61 74 69  nt i, j;.  stati
1c20: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 52 61  c const char zRa
1c30: 6e 64 6f 6d 43 68 61 72 73 5b 5d 20 3d 20 22 61  ndomChars[] = "a
1c40: 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
1c50: 72 73 74 75 76 77 78 79 7a 30 31 32 33 34 35 36  rstuvwxyz0123456
1c60: 37 38 39 22 3b 0a 20 20 73 74 72 63 70 79 28 7a  789";.  strcpy(z
1c70: 42 75 66 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20  Buf, zPrefix);. 
1c80: 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66   j = strlen(zBuf
1c90: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1ca0: 31 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  15; i++){.    in
1cb0: 74 20 63 20 3d 20 72 63 34 62 79 74 65 28 70 52  t c = rc4byte(pR
1cc0: 63 34 29 20 25 20 28 73 69 7a 65 6f 66 28 7a 52  c4) % (sizeof(zR
1cd0: 61 6e 64 6f 6d 43 68 61 72 73 29 20 2d 20 31 29  andomChars) - 1)
1ce0: 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20  ;.    zBuf[j++] 
1cf0: 3d 20 7a 52 61 6e 64 6f 6d 43 68 61 72 73 5b 63  = zRandomChars[c
1d00: 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d  ];.  }.  zBuf[j]
1d10: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f   = 0;.}../*.** O
1d20: 70 65 6e 20 61 20 6e 65 77 20 74 61 62 6c 65 20  pen a new table 
1d30: 63 75 72 73 6f 72 2e 20 20 57 72 69 74 65 20 61  cursor.  Write a
1d40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1d50: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
1d60: 20 44 62 62 65 54 61 62 6c 65 20 73 74 72 75 63   DbbeTable struc
1d70: 74 75 72 65 20 69 6e 74 6f 20 2a 70 70 54 61 62  ture into *ppTab
1d80: 6c 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  le.  Return an i
1d90: 6e 74 65 67 65 72 20 73 75 63 63 65 73 73 0a 2a  nteger success.*
1da0: 2a 20 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  * code:.**.**   
1db0: 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20   SQLITE_OK      
1dc0: 20 20 20 20 49 74 20 77 6f 72 6b 65 64 21 0a 2a      It worked!.*
1dd0: 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 4e  *.**    SQLITE_N
1de0: 4f 4d 45 4d 20 20 20 20 20 20 20 73 71 6c 69 74  OMEM       sqlit
1df0: 65 4d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64  eMalloc() failed
1e00: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45  .**.**    SQLITE
1e10: 5f 50 45 52 4d 20 20 20 20 20 20 20 20 41 74 74  _PERM        Att
1e20: 65 6d 70 74 20 74 6f 20 61 63 63 65 73 73 20 61  empt to access a
1e30: 20 66 69 6c 65 20 66 6f 72 20 77 68 69 63 68 20   file for which 
1e40: 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  file.**         
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63                ac
1e60: 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20  cess permission 
1e70: 69 73 20 64 65 6e 69 65 64 0a 2a 2a 0a 2a 2a 20  is denied.**.** 
1e80: 20 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20     SQLITE_BUSY  
1e90: 20 20 20 20 20 20 41 6e 6f 74 68 65 72 20 74 68        Another th
1ea0: 72 65 61 64 20 6f 72 20 70 72 6f 63 65 73 73 20  read or process 
1eb0: 69 73 20 61 6c 72 65 61 64 79 20 75 73 69 6e 67  is already using
1ec0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1ed0: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 63 6f            the co
1ee0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 66 69 6c 65  rresponding file
1ef0: 20 61 6e 64 20 68 61 73 20 74 68 61 74 20 66 69   and has that fi
1f00: 6c 65 20 6c 6f 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a  le locked..**.**
1f10: 20 20 20 20 53 51 4c 49 54 45 5f 52 45 41 44 4f      SQLITE_READO
1f20: 4e 4c 59 20 20 20 20 54 68 65 20 63 75 72 72 65  NLY    The curre
1f30: 6e 74 20 74 68 72 65 61 64 20 61 6c 72 65 61 64  nt thread alread
1f40: 79 20 68 61 73 20 74 68 69 73 20 66 69 6c 65 20  y has this file 
1f50: 6f 70 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  open.**         
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1f70: 61 64 6f 6e 6c 79 20 62 75 74 20 79 6f 75 20 61  adonly but you a
1f80: 72 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65  re trying to ope
1f90: 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  n for writing..*
1fa0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1fb0: 20 20 20 20 20 20 20 20 28 54 68 69 73 20 63 61          (This ca
1fc0: 6e 20 68 61 70 70 65 6e 20 69 66 20 61 20 53 45  n happen if a SE
1fd0: 4c 45 43 54 20 63 61 6c 6c 62 61 63 6b 20 74 72  LECT callback tr
1fe0: 69 65 73 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ies to.**       
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2000: 64 6f 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  do an UPDATE or 
2010: 44 45 4c 45 54 45 2e 29 0a 2a 2a 0a 2a 2a 20 49  DELETE.).**.** I
2020: 66 20 7a 54 61 62 6c 65 20 69 73 20 30 20 6f 72  f zTable is 0 or
2030: 20 22 22 2c 20 74 68 65 6e 20 61 20 74 65 6d 70   "", then a temp
2040: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 73 20 63  orary table is c
2050: 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  reated and opene
2060: 64 2e 0a 2a 2a 20 54 68 69 73 20 74 61 62 6c 65  d..** This table
2070: 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
2080: 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 77   from the disk w
2090: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
20a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 44  ..*/.int sqliteD
20b0: 62 62 65 4f 70 65 6e 54 61 62 6c 65 28 0a 20 20  bbeOpenTable(.  
20c0: 44 62 62 65 20 2a 70 42 65 2c 20 20 20 20 20 20  Dbbe *pBe,      
20d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
20e0: 61 74 61 62 61 73 65 20 74 68 65 20 74 61 62 6c  atabase the tabl
20f0: 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  e belongs to */.
2100: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
2110: 61 62 6c 65 2c 20 20 20 20 20 2f 2a 20 54 68 65  able,     /* The
2120: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
2130: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 77 72 69 74  le */.  int writ
2140: 65 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  eable,          
2150: 2f 2a 20 54 72 75 65 20 74 6f 20 6f 70 65 6e 20  /* True to open 
2160: 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20  for writing */. 
2170: 20 44 62 62 65 54 61 62 6c 65 20 2a 2a 70 70 54   DbbeTable **ppT
2180: 61 62 6c 65 20 20 20 20 20 2f 2a 20 57 72 69 74  able     /* Writ
2190: 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  e the resulting 
21a0: 74 61 62 6c 65 20 70 6f 69 6e 74 65 72 20 68 65  table pointer he
21b0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  re */.){.  char 
21c0: 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  *zFile;         
21d0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
21e0: 65 20 74 61 62 6c 65 20 66 69 6c 65 20 2a 2f 0a  e table file */.
21f0: 20 20 44 62 62 65 54 61 62 6c 65 20 2a 70 54 61    DbbeTable *pTa
2200: 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  ble;      /* The
2210: 20 6e 65 77 20 74 61 62 6c 65 20 63 75 72 73 6f   new table curso
2220: 72 20 2a 2f 0a 20 20 42 65 46 69 6c 65 20 2a 70  r */.  BeFile *p
2230: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 2f  File;          /
2240: 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
2250: 20 64 61 74 61 20 66 69 6c 65 20 66 6f 72 20 74   data file for t
2260: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  his table */.  i
2270: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2280: 4b 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  K;     /* Return
2290: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
22a0: 72 77 5f 6d 61 73 6b 3b 20 20 20 20 20 20 20 20  rw_mask;        
22b0: 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f      /* Permissio
22c0: 6e 73 20 6d 61 73 6b 20 66 6f 72 20 6f 70 65 6e  ns mask for open
22d0: 69 6e 67 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20  ing a table */. 
22e0: 20 69 6e 74 20 6d 6f 64 65 3b 20 20 20 20 20 20   int mode;      
22f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 65           /* Mode
2300: 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 74   for opening a t
2310: 61 62 6c 65 20 2a 2f 0a 0a 20 20 2a 70 70 54 61  able */..  *ppTa
2320: 62 6c 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  ble = 0;.  pTabl
2330: 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  e = sqliteMalloc
2340: 28 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 6c 65  ( sizeof(*pTable
2350: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  ) );.  if( pTabl
2360: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
2370: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66  LITE_NOMEM;.  if
2380: 28 20 7a 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( zTable ){.    
2390: 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 46 69  zFile = sqliteFi
23a0: 6c 65 4f 66 54 61 62 6c 65 28 70 42 65 2c 20 7a  leOfTable(pBe, z
23b0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 6f 72 28  Table);.    for(
23c0: 70 46 69 6c 65 3d 70 42 65 2d 3e 70 4f 70 65 6e  pFile=pBe->pOpen
23d0: 3b 20 70 46 69 6c 65 3b 20 70 46 69 6c 65 3d 70  ; pFile; pFile=p
23e0: 46 69 6c 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  File->pNext){.  
23f0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70      if( strcmp(p
2400: 46 69 6c 65 2d 3e 7a 4e 61 6d 65 2c 7a 46 69 6c  File->zName,zFil
2410: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
2420: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2430: 20 20 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20    pFile = 0;.   
2440: 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a   zFile = 0;.  }.
2450: 20 20 69 66 28 20 70 46 69 6c 65 3d 3d 30 20 29    if( pFile==0 )
2460: 7b 0a 20 20 20 20 69 66 28 20 77 72 69 74 65 61  {.    if( writea
2470: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 77 5f  ble ){.      rw_
2480: 6d 61 73 6b 20 3d 20 47 44 42 4d 5f 57 52 43 52  mask = GDBM_WRCR
2490: 45 41 54 20 7c 20 47 44 42 4d 5f 46 41 53 54 3b  EAT | GDBM_FAST;
24a0: 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 30 36  .      mode = 06
24b0: 34 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  40;.    }else{. 
24c0: 20 20 20 20 20 72 77 5f 6d 61 73 6b 20 3d 20 47       rw_mask = G
24d0: 44 42 4d 5f 52 45 41 44 45 52 3b 0a 20 20 20 20  DBM_READER;.    
24e0: 20 20 6d 6f 64 65 20 3d 20 30 36 34 30 3b 0a 20    mode = 0640;. 
24f0: 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 20 3d     }.    pFile =
2500: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
2510: 69 7a 65 6f 66 28 2a 70 46 69 6c 65 29 20 29 3b  izeof(*pFile) );
2520: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 3d 3d  .    if( pFile==
2530: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2540: 65 46 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20  eFree(zFile);.  
2550: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2560: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2570: 20 20 20 69 66 28 20 7a 46 69 6c 65 20 29 7b 0a     if( zFile ){.
2580: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 66        pFile->dbf
2590: 20 3d 20 67 64 62 6d 5f 6f 70 65 6e 28 7a 46 69   = gdbm_open(zFi
25a0: 6c 65 2c 20 30 2c 20 72 77 5f 6d 61 73 6b 2c 20  le, 0, rw_mask, 
25b0: 6d 6f 64 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65  mode, 0);.    }e
25c0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  lse{.      int l
25d0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 73 74 72 75  imit;.      stru
25e0: 63 74 20 72 63 34 20 2a 70 52 63 34 3b 0a 20 20  ct rc4 *pRc4;.  
25f0: 20 20 20 20 63 68 61 72 20 7a 52 61 6e 64 6f 6d      char zRandom
2600: 5b 35 30 5d 3b 0a 20 20 20 20 20 20 70 52 63 34  [50];.      pRc4
2610: 20 3d 20 26 70 42 65 2d 3e 72 63 34 3b 0a 20 20   = &pBe->rc4;.  
2620: 20 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20      zFile = 0;. 
2630: 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 35 3b 0a       limit = 5;.
2640: 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
2650: 20 20 20 72 61 6e 64 6f 6d 4e 61 6d 65 28 26 70     randomName(&p
2660: 42 65 2d 3e 72 63 34 2c 20 7a 52 61 6e 64 6f 6d  Be->rc4, zRandom
2670: 2c 20 22 5f 74 65 6d 70 5f 74 61 62 6c 65 5f 22  , "_temp_table_"
2680: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2690: 65 46 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20  eFree(zFile);.  
26a0: 20 20 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71        zFile = sq
26b0: 6c 69 74 65 46 69 6c 65 4f 66 54 61 62 6c 65 28  liteFileOfTable(
26c0: 70 42 65 2c 20 7a 52 61 6e 64 6f 6d 29 3b 0a 20  pBe, zRandom);. 
26d0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 62         pFile->db
26e0: 66 20 3d 20 67 64 62 6d 5f 6f 70 65 6e 28 7a 46  f = gdbm_open(zF
26f0: 69 6c 65 2c 20 30 2c 20 72 77 5f 6d 61 73 6b 2c  ile, 0, rw_mask,
2700: 20 6d 6f 64 65 2c 20 30 29 3b 0a 20 20 20 20 20   mode, 0);.     
2710: 20 7d 77 68 69 6c 65 28 20 70 46 69 6c 65 2d 3e   }while( pFile->
2720: 64 62 66 3d 3d 30 20 26 26 20 6c 69 6d 69 74 2d  dbf==0 && limit-
2730: 2d 20 3e 3d 20 30 29 3b 0a 20 20 20 20 20 20 70  - >= 0);.      p
2740: 46 69 6c 65 2d 3e 64 65 6c 4f 6e 43 6c 6f 73 65  File->delOnClose
2750: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
2760: 70 46 69 6c 65 2d 3e 77 72 69 74 65 61 62 6c 65  pFile->writeable
2770: 20 3d 20 77 72 69 74 65 61 62 6c 65 3b 0a 20 20   = writeable;.  
2780: 20 20 70 46 69 6c 65 2d 3e 7a 4e 61 6d 65 20 3d    pFile->zName =
2790: 20 7a 46 69 6c 65 3b 0a 20 20 20 20 70 46 69 6c   zFile;.    pFil
27a0: 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  e->nRef = 1;.   
27b0: 20 70 46 69 6c 65 2d 3e 70 50 72 65 76 20 3d 20   pFile->pPrev = 
27c0: 30 3b 0a 20 20 20 20 69 66 28 20 70 42 65 2d 3e  0;.    if( pBe->
27d0: 70 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 70  pOpen ){.      p
27e0: 42 65 2d 3e 70 4f 70 65 6e 2d 3e 70 50 72 65 76  Be->pOpen->pPrev
27f0: 20 3d 20 70 46 69 6c 65 3b 0a 20 20 20 20 7d 0a   = pFile;.    }.
2800: 20 20 20 20 70 46 69 6c 65 2d 3e 70 4e 65 78 74      pFile->pNext
2810: 20 3d 20 70 42 65 2d 3e 70 4f 70 65 6e 3b 0a 20   = pBe->pOpen;. 
2820: 20 20 20 70 42 65 2d 3e 70 4f 70 65 6e 20 3d 20     pBe->pOpen = 
2830: 70 46 69 6c 65 3b 0a 20 20 20 20 69 66 28 20 70  pFile;.    if( p
2840: 46 69 6c 65 2d 3e 64 62 66 3d 3d 30 20 29 7b 0a  File->dbf==0 ){.
2850: 20 20 20 20 20 20 69 66 28 20 21 77 72 69 74 65        if( !write
2860: 61 62 6c 65 20 26 26 20 61 63 63 65 73 73 28 7a  able && access(z
2870: 46 69 6c 65 2c 30 29 20 29 7b 0a 20 20 20 20 20  File,0) ){.     
2880: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2890: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  K;.      }else i
28a0: 66 28 20 61 63 63 65 73 73 28 7a 46 69 6c 65 2c  f( access(zFile,
28b0: 57 5f 4f 4b 7c 52 5f 4f 4b 29 20 29 7b 0a 20 20  W_OK|R_OK) ){.  
28c0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
28d0: 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 7d 65  E_PERM;.      }e
28e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
28f0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
2900: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2910: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
2920: 46 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20  Free(zFile);.   
2930: 20 70 46 69 6c 65 2d 3e 6e 52 65 66 2b 2b 3b 0a   pFile->nRef++;.
2940: 20 20 20 20 69 66 28 20 77 72 69 74 65 61 62 6c      if( writeabl
2950: 65 20 26 26 20 21 70 46 69 6c 65 2d 3e 77 72 69  e && !pFile->wri
2960: 74 65 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  teable ){.      
2970: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
2980: 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ONLY;.    }.  }.
2990: 20 20 70 54 61 62 6c 65 2d 3e 70 42 65 20 3d 20    pTable->pBe = 
29a0: 70 42 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70  pBe;.  pTable->p
29b0: 46 69 6c 65 20 3d 20 70 46 69 6c 65 3b 0a 20 20  File = pFile;.  
29c0: 70 54 61 62 6c 65 2d 3e 72 65 61 64 50 65 6e 64  pTable->readPend
29d0: 69 6e 67 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  ing = 0;.  pTabl
29e0: 65 2d 3e 6e 65 65 64 52 65 77 69 6e 64 20 3d 20  e->needRewind = 
29f0: 31 3b 0a 20 20 2a 70 70 54 61 62 6c 65 20 3d 20  1;.  *ppTable = 
2a00: 70 54 61 62 6c 65 3b 0a 20 20 72 65 74 75 72 6e  pTable;.  return
2a10: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72   rc;.}../*.** Dr
2a20: 6f 70 20 61 20 74 61 62 6c 65 20 66 72 6f 6d 20  op a table from 
2a30: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
2a40: 68 65 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 64  he file on the d
2a50: 69 73 6b 20 74 68 61 74 20 63 6f 72 72 65 73 70  isk that corresp
2a60: 6f 6e 64 73 0a 2a 2a 20 74 6f 20 74 68 69 73 20  onds.** to this 
2a70: 74 61 62 6c 65 20 69 73 20 64 65 6c 65 74 65 64  table is deleted
2a80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2a90: 44 62 62 65 44 72 6f 70 54 61 62 6c 65 28 44 62  DbbeDropTable(Db
2aa0: 62 65 20 2a 70 42 65 2c 20 63 6f 6e 73 74 20 63  be *pBe, const c
2ab0: 68 61 72 20 2a 7a 54 61 62 6c 65 29 7b 0a 20 20  har *zTable){.  
2ac0: 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20  char *zFile;    
2ad0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2ae0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 66 69 6c  of the table fil
2af0: 65 20 2a 2f 0a 0a 20 20 7a 46 69 6c 65 20 3d 20  e */..  zFile = 
2b00: 73 71 6c 69 74 65 46 69 6c 65 4f 66 54 61 62 6c  sqliteFileOfTabl
2b10: 65 28 70 42 65 2c 20 7a 54 61 62 6c 65 29 3b 0a  e(pBe, zTable);.
2b20: 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 29 3b    unlink(zFile);
2b30: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46  .  sqliteFree(zF
2b40: 69 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ile);.}../*.** R
2b50: 65 6f 72 67 61 6e 69 7a 65 20 61 20 74 61 62 6c  eorganize a tabl
2b60: 65 20 74 6f 20 72 65 64 75 63 65 20 73 65 61 72  e to reduce sear
2b70: 63 68 20 74 69 6d 65 73 20 61 6e 64 20 64 69 73  ch times and dis
2b80: 6b 20 75 73 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  k usage..*/.void
2b90: 20 73 71 6c 69 74 65 44 62 62 65 52 65 6f 72 67   sqliteDbbeReorg
2ba0: 61 6e 69 7a 65 54 61 62 6c 65 28 44 62 62 65 20  anizeTable(Dbbe 
2bb0: 2a 70 42 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  *pBe, const char
2bc0: 20 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 44 62 62   *zTable){.  Dbb
2bd0: 65 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20  eTable *pTab;.. 
2be0: 20 69 66 28 20 73 71 6c 69 74 65 44 62 62 65 4f   if( sqliteDbbeO
2bf0: 70 65 6e 54 61 62 6c 65 28 70 42 65 2c 20 7a 54  penTable(pBe, zT
2c00: 61 62 6c 65 2c 20 31 2c 20 26 70 54 61 62 29 21  able, 1, &pTab)!
2c10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c20: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
2c30: 69 66 28 20 70 54 61 62 20 26 26 20 70 54 61 62  if( pTab && pTab
2c40: 2d 3e 70 46 69 6c 65 20 26 26 20 70 54 61 62 2d  ->pFile && pTab-
2c50: 3e 70 46 69 6c 65 2d 3e 64 62 66 20 29 7b 0a 20  >pFile->dbf ){. 
2c60: 20 20 20 67 64 62 6d 5f 72 65 6f 72 67 61 6e 69     gdbm_reorgani
2c70: 7a 65 28 70 54 61 62 2d 3e 70 46 69 6c 65 2d 3e  ze(pTab->pFile->
2c80: 64 62 66 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dbf);.  }.  if( 
2c90: 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  pTab ){.    sqli
2ca0: 74 65 44 62 62 65 43 6c 6f 73 65 54 61 62 6c 65  teDbbeCloseTable
2cb0: 28 70 54 61 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pTab);.  }.}../
2cc0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 74 61 62  *.** Close a tab
2cd0: 6c 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70  le previously op
2ce0: 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 44 62  ened by sqliteDb
2cf0: 62 65 4f 70 65 6e 54 61 62 6c 65 28 29 2e 0a 2a  beOpenTable()..*
2d00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 62 62  /.void sqliteDbb
2d10: 65 43 6c 6f 73 65 54 61 62 6c 65 28 44 62 62 65  eCloseTable(Dbbe
2d20: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
2d30: 20 20 42 65 46 69 6c 65 20 2a 70 46 69 6c 65 3b    BeFile *pFile;
2d40: 0a 20 20 44 62 62 65 20 2a 70 42 65 3b 0a 20 20  .  Dbbe *pBe;.  
2d50: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20  if( pTable==0 ) 
2d60: 72 65 74 75 72 6e 3b 0a 20 20 70 46 69 6c 65 20  return;.  pFile 
2d70: 3d 20 70 54 61 62 6c 65 2d 3e 70 46 69 6c 65 3b  = pTable->pFile;
2d80: 0a 20 20 70 42 65 20 3d 20 70 54 61 62 6c 65 2d  .  pBe = pTable-
2d90: 3e 70 42 65 3b 0a 20 20 70 46 69 6c 65 2d 3e 6e  >pBe;.  pFile->n
2da0: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 46 69  Ref--;.  if( pFi
2db0: 6c 65 2d 3e 64 62 66 21 3d 4e 55 4c 4c 20 29 7b  le->dbf!=NULL ){
2dc0: 0a 20 20 20 20 67 64 62 6d 5f 73 79 6e 63 28 70  .    gdbm_sync(p
2dd0: 46 69 6c 65 2d 3e 64 62 66 29 3b 0a 20 20 7d 0a  File->dbf);.  }.
2de0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6e 52 65    if( pFile->nRe
2df0: 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
2e00: 70 46 69 6c 65 2d 3e 64 62 66 21 3d 4e 55 4c 4c  pFile->dbf!=NULL
2e10: 20 29 7b 0a 20 20 20 20 20 20 67 64 62 6d 5f 63   ){.      gdbm_c
2e20: 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 62 66 29  lose(pFile->dbf)
2e30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2e40: 70 46 69 6c 65 2d 3e 70 50 72 65 76 20 29 7b 0a  pFile->pPrev ){.
2e50: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 50 72        pFile->pPr
2e60: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 46 69 6c  ev->pNext = pFil
2e70: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  e->pNext;.    }e
2e80: 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 65 2d 3e  lse{.      pBe->
2e90: 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70  pOpen = pFile->p
2ea0: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
2eb0: 69 66 28 20 70 46 69 6c 65 2d 3e 70 4e 65 78 74  if( pFile->pNext
2ec0: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
2ed0: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
2ee0: 70 46 69 6c 65 2d 3e 70 50 72 65 76 3b 0a 20 20  pFile->pPrev;.  
2ef0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 69 6c    }.    if( pFil
2f00: 65 2d 3e 64 65 6c 4f 6e 43 6c 6f 73 65 20 29 7b  e->delOnClose ){
2f10: 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28 70 46  .      unlink(pF
2f20: 69 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  ile->zName);.   
2f30: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
2f40: 65 28 70 46 69 6c 65 2d 3e 7a 4e 61 6d 65 29 3b  e(pFile->zName);
2f50: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  .    memset(pFil
2f60: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 46  e, 0, sizeof(*pF
2f70: 69 6c 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ile));.    sqlit
2f80: 65 46 72 65 65 28 70 46 69 6c 65 29 3b 0a 20 20  eFree(pFile);.  
2f90: 7d 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  }.  if( pTable->
2fa0: 6b 65 79 2e 64 70 74 72 20 29 20 66 72 65 65 28  key.dptr ) free(
2fb0: 70 54 61 62 6c 65 2d 3e 6b 65 79 2e 64 70 74 72  pTable->key.dptr
2fc0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  );.  if( pTable-
2fd0: 3e 64 61 74 61 2e 64 70 74 72 20 29 20 66 72 65  >data.dptr ) fre
2fe0: 65 28 70 54 61 62 6c 65 2d 3e 64 61 74 61 2e 64  e(pTable->data.d
2ff0: 70 74 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  ptr);.  memset(p
3000: 54 61 62 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Table, 0, sizeof
3010: 28 2a 70 54 61 62 6c 65 29 29 3b 0a 20 20 73 71  (*pTable));.  sq
3020: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 29  liteFree(pTable)
3030: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
3040: 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 75 6d   the given datum
3050: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3060: 64 61 74 75 6d 43 6c 65 61 72 28 64 61 74 75 6d  datumClear(datum
3070: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64   *p){.  if( p->d
3080: 70 74 72 20 29 20 66 72 65 65 28 70 2d 3e 64 70  ptr ) free(p->dp
3090: 74 72 29 3b 0a 20 20 70 2d 3e 64 70 74 72 20 3d  tr);.  p->dptr =
30a0: 20 30 3b 0a 20 20 70 2d 3e 64 73 69 7a 65 20 3d   0;.  p->dsize =
30b0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 65 74   0;.}../*.** Fet
30c0: 63 68 20 61 20 73 69 6e 67 6c 65 20 72 65 63 6f  ch a single reco
30d0: 72 64 20 66 72 6f 6d 20 61 6e 20 6f 70 65 6e 20  rd from an open 
30e0: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 31  table.  Return 1
30f0: 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 61   on success.** a
3100: 6e 64 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e  nd 0 on failure.
3110: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 44 62  .*/.int sqliteDb
3120: 62 65 46 65 74 63 68 28 44 62 62 65 54 61 62 6c  beFetch(DbbeTabl
3130: 65 20 2a 70 54 61 62 6c 65 2c 20 69 6e 74 20 6e  e *pTable, int n
3140: 4b 65 79 2c 20 63 68 61 72 20 2a 70 4b 65 79 29  Key, char *pKey)
3150: 7b 0a 20 20 64 61 74 75 6d 20 6b 65 79 3b 0a 20  {.  datum key;. 
3160: 20 6b 65 79 2e 64 73 69 7a 65 20 3d 20 6e 4b 65   key.dsize = nKe
3170: 79 3b 0a 20 20 6b 65 79 2e 64 70 74 72 20 3d 20  y;.  key.dptr = 
3180: 70 4b 65 79 3b 0a 20 20 64 61 74 75 6d 43 6c 65  pKey;.  datumCle
3190: 61 72 28 26 70 54 61 62 6c 65 2d 3e 6b 65 79 29  ar(&pTable->key)
31a0: 3b 0a 20 20 64 61 74 75 6d 43 6c 65 61 72 28 26  ;.  datumClear(&
31b0: 70 54 61 62 6c 65 2d 3e 64 61 74 61 29 3b 0a 20  pTable->data);. 
31c0: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70 46 69   if( pTable->pFi
31d0: 6c 65 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 46  le && pTable->pF
31e0: 69 6c 65 2d 3e 64 62 66 20 29 7b 0a 20 20 20 20  ile->dbf ){.    
31f0: 70 54 61 62 6c 65 2d 3e 64 61 74 61 20 3d 20 67  pTable->data = g
3200: 64 62 6d 5f 66 65 74 63 68 28 70 54 61 62 6c 65  dbm_fetch(pTable
3210: 2d 3e 70 46 69 6c 65 2d 3e 64 62 66 2c 20 6b 65  ->pFile->dbf, ke
3220: 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  y);.  }.  return
3230: 20 70 54 61 62 6c 65 2d 3e 64 61 74 61 2e 64 70   pTable->data.dp
3240: 74 72 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tr!=0;.}../*.** 
3250: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
3260: 67 69 76 65 6e 20 6b 65 79 20 69 73 20 61 6c 72  given key is alr
3270: 65 61 64 79 20 69 6e 20 74 68 65 20 74 61 62 6c  eady in the tabl
3280: 65 2e 20 20 52 65 74 75 72 6e 20 30 0a 2a 2a 20  e.  Return 0.** 
3290: 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2a 2f  if it is not..*/
32a0: 0a 69 6e 74 20 73 71 6c 69 74 65 44 62 62 65 54  .int sqliteDbbeT
32b0: 65 73 74 28 44 62 62 65 54 61 62 6c 65 20 2a 70  est(DbbeTable *p
32c0: 54 61 62 6c 65 2c 20 69 6e 74 20 6e 4b 65 79 2c  Table, int nKey,
32d0: 20 63 68 61 72 20 2a 70 4b 65 79 29 7b 0a 20 20   char *pKey){.  
32e0: 64 61 74 75 6d 20 6b 65 79 3b 0a 20 20 69 6e 74  datum key;.  int
32f0: 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 6b   result = 0;.  k
3300: 65 79 2e 64 73 69 7a 65 20 3d 20 6e 4b 65 79 3b  ey.dsize = nKey;
3310: 0a 20 20 6b 65 79 2e 64 70 74 72 20 3d 20 70 4b  .  key.dptr = pK
3320: 65 79 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  ey;.  if( pTable
3330: 2d 3e 70 46 69 6c 65 20 26 26 20 70 54 61 62 6c  ->pFile && pTabl
3340: 65 2d 3e 70 46 69 6c 65 2d 3e 64 62 66 20 29 7b  e->pFile->dbf ){
3350: 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 67 64  .    result = gd
3360: 62 6d 5f 65 78 69 73 74 73 28 70 54 61 62 6c 65  bm_exists(pTable
3370: 2d 3e 70 46 69 6c 65 2d 3e 64 62 66 2c 20 6b 65  ->pFile->dbf, ke
3380: 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  y);.  }.  return
3390: 20 72 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   result;.}../*.*
33a0: 2a 20 43 6f 70 79 20 62 79 74 65 73 20 66 72 6f  * Copy bytes fro
33b0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6b 65  m the current ke
33c0: 79 20 6f 72 20 64 61 74 61 20 69 6e 74 6f 20 61  y or data into a
33d0: 20 62 75 66 66 65 72 20 73 75 70 70 6c 69 65 64   buffer supplied
33e0: 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 69   by.** the calli
33f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65  ng function.  Re
3400: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
3410: 6f 66 20 62 79 74 65 73 20 63 6f 70 69 65 64 2e  of bytes copied.
3420: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 44 62  .*/.int sqliteDb
3430: 62 65 43 6f 70 79 4b 65 79 28 44 62 62 65 54 61  beCopyKey(DbbeTa
3440: 62 6c 65 20 2a 70 54 61 62 6c 65 2c 20 69 6e 74  ble *pTable, int
3450: 20 6f 66 66 73 65 74 2c 20 69 6e 74 20 73 69 7a   offset, int siz
3460: 65 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  e, char *zBuf){.
3470: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 66 28 20 6f    int n;.  if( o
3480: 66 66 73 65 74 3e 3d 70 54 61 62 6c 65 2d 3e 6b  ffset>=pTable->k
3490: 65 79 2e 64 73 69 7a 65 20 29 20 72 65 74 75 72  ey.dsize ) retur
34a0: 6e 20 30 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  n 0;.  if( offse
34b0: 74 2b 73 69 7a 65 3e 70 54 61 62 6c 65 2d 3e 6b  t+size>pTable->k
34c0: 65 79 2e 64 73 69 7a 65 20 29 7b 0a 20 20 20 20  ey.dsize ){.    
34d0: 6e 20 3d 20 70 54 61 62 6c 65 2d 3e 6b 65 79 2e  n = pTable->key.
34e0: 64 73 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  dsize - offset;.
34f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 20 3d    }else{.    n =
3500: 20 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 6d 65 6d   size;.  }.  mem
3510: 63 70 79 28 7a 42 75 66 2c 20 26 70 54 61 62 6c  cpy(zBuf, &pTabl
3520: 65 2d 3e 6b 65 79 2e 64 70 74 72 5b 6f 66 66 73  e->key.dptr[offs
3530: 65 74 5d 2c 20 6e 29 3b 0a 20 20 72 65 74 75 72  et], n);.  retur
3540: 6e 20 6e 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  n n;.}.int sqlit
3550: 65 44 62 62 65 43 6f 70 79 44 61 74 61 28 44 62  eDbbeCopyData(Db
3560: 62 65 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 2c  beTable *pTable,
3570: 20 69 6e 74 20 6f 66 66 73 65 74 2c 20 69 6e 74   int offset, int
3580: 20 73 69 7a 65 2c 20 63 68 61 72 20 2a 7a 42 75   size, char *zBu
3590: 66 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  f){.  int n;.  i
35a0: 66 28 20 70 54 61 62 6c 65 2d 3e 72 65 61 64 50  f( pTable->readP
35b0: 65 6e 64 69 6e 67 20 26 26 20 70 54 61 62 6c 65  ending && pTable
35c0: 2d 3e 70 46 69 6c 65 20 26 26 20 70 54 61 62 6c  ->pFile && pTabl
35d0: 65 2d 3e 70 46 69 6c 65 2d 3e 64 62 66 20 29 7b  e->pFile->dbf ){
35e0: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 64 61 74  .    pTable->dat
35f0: 61 20 3d 20 67 64 62 6d 5f 66 65 74 63 68 28 70  a = gdbm_fetch(p
3600: 54 61 62 6c 65 2d 3e 70 46 69 6c 65 2d 3e 64 62  Table->pFile->db
3610: 66 2c 20 70 54 61 62 6c 65 2d 3e 6b 65 79 29 3b  f, pTable->key);
3620: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 72 65 61  .    pTable->rea
3630: 64 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20  dPending = 0;.  
3640: 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d  }.  if( offset>=
3650: 70 54 61 62 6c 65 2d 3e 64 61 74 61 2e 64 73 69  pTable->data.dsi
3660: 7a 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ze ) return 0;. 
3670: 20 69 66 28 20 6f 66 66 73 65 74 2b 73 69 7a 65   if( offset+size
3680: 3e 70 54 61 62 6c 65 2d 3e 64 61 74 61 2e 64 73  >pTable->data.ds
3690: 69 7a 65 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  ize ){.    n = p
36a0: 54 61 62 6c 65 2d 3e 64 61 74 61 2e 64 73 69 7a  Table->data.dsiz
36b0: 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 7d 65  e - offset;.  }e
36c0: 6c 73 65 7b 0a 20 20 20 20 6e 20 3d 20 73 69 7a  lse{.    n = siz
36d0: 65 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  e;.  }.  memcpy(
36e0: 7a 42 75 66 2c 20 26 70 54 61 62 6c 65 2d 3e 64  zBuf, &pTable->d
36f0: 61 74 61 2e 64 70 74 72 5b 6f 66 66 73 65 74 5d  ata.dptr[offset]
3700: 2c 20 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  , n);.  return n
3710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
3720: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 62  n a pointer to b
3730: 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 6b 65  ytes from the ke
3740: 79 20 6f 72 20 64 61 74 61 2e 20 20 54 68 65 20  y or data.  The 
3750: 64 61 74 61 20 72 65 74 75 72 6e 65 64 0a 2a 2a  data returned.**
3760: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 0a 2a   is ephemeral..*
3770: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 44 62  /.char *sqliteDb
3780: 62 65 52 65 61 64 4b 65 79 28 44 62 62 65 54 61  beReadKey(DbbeTa
3790: 62 6c 65 20 2a 70 54 61 62 6c 65 2c 20 69 6e 74  ble *pTable, int
37a0: 20 6f 66 66 73 65 74 29 7b 0a 20 20 69 66 28 20   offset){.  if( 
37b0: 6f 66 66 73 65 74 3c 30 20 7c 7c 20 6f 66 66 73  offset<0 || offs
37c0: 65 74 3e 3d 70 54 61 62 6c 65 2d 3e 6b 65 79 2e  et>=pTable->key.
37d0: 64 73 69 7a 65 20 29 20 72 65 74 75 72 6e 20 22  dsize ) return "
37e0: 22 3b 0a 20 20 72 65 74 75 72 6e 20 26 70 54 61  ";.  return &pTa
37f0: 62 6c 65 2d 3e 6b 65 79 2e 64 70 74 72 5b 6f 66  ble->key.dptr[of
3800: 66 73 65 74 5d 3b 0a 7d 0a 63 68 61 72 20 2a 73  fset];.}.char *s
3810: 71 6c 69 74 65 44 62 62 65 52 65 61 64 44 61 74  qliteDbbeReadDat
3820: 61 28 44 62 62 65 54 61 62 6c 65 20 2a 70 54 61  a(DbbeTable *pTa
3830: 62 6c 65 2c 20 69 6e 74 20 6f 66 66 73 65 74 29  ble, int offset)
3840: 7b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  {.  if( pTable->
3850: 72 65 61 64 50 65 6e 64 69 6e 67 20 26 26 20 70  readPending && p
3860: 54 61 62 6c 65 2d 3e 70 46 69 6c 65 20 26 26 20  Table->pFile && 
3870: 70 54 61 62 6c 65 2d 3e 70 46 69 6c 65 2d 3e 64  pTable->pFile->d
3880: 62 66 20 29 7b 0a 20 20 20 20 70 54 61 62 6c 65  bf ){.    pTable
3890: 2d 3e 64 61 74 61 20 3d 20 67 64 62 6d 5f 66 65  ->data = gdbm_fe
38a0: 74 63 68 28 70 54 61 62 6c 65 2d 3e 70 46 69 6c  tch(pTable->pFil
38b0: 65 2d 3e 64 62 66 2c 20 70 54 61 62 6c 65 2d 3e  e->dbf, pTable->
38c0: 6b 65 79 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  key);.    pTable
38d0: 2d 3e 72 65 61 64 50 65 6e 64 69 6e 67 20 3d 20  ->readPending = 
38e0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66  0;.  }.  if( off
38f0: 73 65 74 3c 30 20 7c 7c 20 6f 66 66 73 65 74 3e  set<0 || offset>
3900: 3d 70 54 61 62 6c 65 2d 3e 64 61 74 61 2e 64 73  =pTable->data.ds
3910: 69 7a 65 20 29 20 72 65 74 75 72 6e 20 22 22 3b  ize ) return "";
3920: 0a 20 20 72 65 74 75 72 6e 20 26 70 54 61 62 6c  .  return &pTabl
3930: 65 2d 3e 64 61 74 61 2e 64 70 74 72 5b 6f 66 66  e->data.dptr[off
3940: 73 65 74 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  set];.}../*.** R
3950: 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
3960: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
3970: 69 6e 20 65 69 74 68 65 72 20 64 61 74 61 20 6f  in either data o
3980: 72 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  r key..*/.int sq
3990: 6c 69 74 65 44 62 62 65 4b 65 79 4c 65 6e 67 74  liteDbbeKeyLengt
39a0: 68 28 44 62 62 65 54 61 62 6c 65 20 2a 70 54 61  h(DbbeTable *pTa
39b0: 62 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ble){.  return p
39c0: 54 61 62 6c 65 2d 3e 6b 65 79 2e 64 73 69 7a 65  Table->key.dsize
39d0: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 44 62  ;.}.int sqliteDb
39e0: 62 65 44 61 74 61 4c 65 6e 67 74 68 28 44 62 62  beDataLength(Dbb
39f0: 65 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b  eTable *pTable){
3a00: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 72  .  if( pTable->r
3a10: 65 61 64 50 65 6e 64 69 6e 67 20 26 26 20 70 54  eadPending && pT
3a20: 61 62 6c 65 2d 3e 70 46 69 6c 65 20 26 26 20 70  able->pFile && p
3a30: 54 61 62 6c 65 2d 3e 70 46 69 6c 65 2d 3e 64 62  Table->pFile->db
3a40: 66 20 29 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d  f ){.    pTable-
3a50: 3e 64 61 74 61 20 3d 20 67 64 62 6d 5f 66 65 74  >data = gdbm_fet
3a60: 63 68 28 70 54 61 62 6c 65 2d 3e 70 46 69 6c 65  ch(pTable->pFile
3a70: 2d 3e 64 62 66 2c 20 70 54 61 62 6c 65 2d 3e 6b  ->dbf, pTable->k
3a80: 65 79 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  ey);.    pTable-
3a90: 3e 72 65 61 64 50 65 6e 64 69 6e 67 20 3d 20 30  >readPending = 0
3aa0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3ab0: 54 61 62 6c 65 2d 3e 64 61 74 61 2e 64 73 69 7a  Table->data.dsiz
3ac0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  e;.}../*.** Make
3ad0: 20 69 73 20 73 6f 20 74 68 61 74 20 74 68 65 20   is so that the 
3ae0: 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  next call to sql
3af0: 69 74 65 4e 65 78 74 4b 65 79 28 29 20 66 69 6e  iteNextKey() fin
3b00: 64 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  ds the first.** 
3b10: 6b 65 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  key of the table
3b20: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 44  ..*/.int sqliteD
3b30: 62 62 65 52 65 77 69 6e 64 28 44 62 62 65 54 61  bbeRewind(DbbeTa
3b40: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
3b50: 70 54 61 62 6c 65 2d 3e 6e 65 65 64 52 65 77 69  pTable->needRewi
3b60: 6e 64 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  nd = 1;.  return
3b70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
3b80: 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 6e 65  *.** Read the ne
3b90: 78 74 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20  xt key from the 
3ba0: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 31  table.  Return 1
3bb0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 52 65   on success.  Re
3bc0: 74 75 72 6e 0a 2a 2a 20 30 20 69 66 20 74 68 65  turn.** 0 if the
3bd0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6b  re are no more k
3be0: 65 79 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  eys..*/.int sqli
3bf0: 74 65 44 62 62 65 4e 65 78 74 4b 65 79 28 44 62  teDbbeNextKey(Db
3c00: 62 65 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  beTable *pTable)
3c10: 7b 0a 20 20 64 61 74 75 6d 20 6e 65 78 74 6b 65  {.  datum nextke
3c20: 79 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  y;.  int rc;.  i
3c30: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 7c 7c 20  f( pTable==0 || 
3c40: 70 54 61 62 6c 65 2d 3e 70 46 69 6c 65 3d 3d 30  pTable->pFile==0
3c50: 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 70 46 69 6c   || pTable->pFil
3c60: 65 2d 3e 64 62 66 3d 3d 30 20 29 7b 0a 20 20 20  e->dbf==0 ){.   
3c70: 20 70 54 61 62 6c 65 2d 3e 72 65 61 64 50 65 6e   pTable->readPen
3c80: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 72 65  ding = 0;.    re
3c90: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
3ca0: 28 20 70 54 61 62 6c 65 2d 3e 6e 65 65 64 52 65  ( pTable->needRe
3cb0: 77 69 6e 64 20 29 7b 0a 20 20 20 20 6e 65 78 74  wind ){.    next
3cc0: 6b 65 79 20 3d 20 67 64 62 6d 5f 66 69 72 73 74  key = gdbm_first
3cd0: 6b 65 79 28 70 54 61 62 6c 65 2d 3e 70 46 69 6c  key(pTable->pFil
3ce0: 65 2d 3e 64 62 66 29 3b 0a 20 20 20 20 70 54 61  e->dbf);.    pTa
3cf0: 62 6c 65 2d 3e 6e 65 65 64 52 65 77 69 6e 64 20  ble->needRewind 
3d00: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
3d10: 20 20 6e 65 78 74 6b 65 79 20 3d 20 67 64 62 6d    nextkey = gdbm
3d20: 5f 6e 65 78 74 6b 65 79 28 70 54 61 62 6c 65 2d  _nextkey(pTable-
3d30: 3e 70 46 69 6c 65 2d 3e 64 62 66 2c 20 70 54 61  >pFile->dbf, pTa
3d40: 62 6c 65 2d 3e 6b 65 79 29 3b 0a 20 20 7d 0a 20  ble->key);.  }. 
3d50: 20 64 61 74 75 6d 43 6c 65 61 72 28 26 70 54 61   datumClear(&pTa
3d60: 62 6c 65 2d 3e 6b 65 79 29 3b 0a 20 20 64 61 74  ble->key);.  dat
3d70: 75 6d 43 6c 65 61 72 28 26 70 54 61 62 6c 65 2d  umClear(&pTable-
3d80: 3e 64 61 74 61 29 3b 0a 20 20 70 54 61 62 6c 65  >data);.  pTable
3d90: 2d 3e 6b 65 79 20 3d 20 6e 65 78 74 6b 65 79 3b  ->key = nextkey;
3da0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6b  .  if( pTable->k
3db0: 65 79 2e 64 70 74 72 20 29 7b 0a 20 20 20 20 70  ey.dptr ){.    p
3dc0: 54 61 62 6c 65 2d 3e 72 65 61 64 50 65 6e 64 69  Table->readPendi
3dd0: 6e 67 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d  ng = 1;.    rc =
3de0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
3df0: 20 70 54 61 62 6c 65 2d 3e 6e 65 65 64 52 65 77   pTable->needRew
3e00: 69 6e 64 20 3d 20 31 3b 0a 20 20 20 20 70 54 61  ind = 1;.    pTa
3e10: 62 6c 65 2d 3e 72 65 61 64 50 65 6e 64 69 6e 67  ble->readPending
3e20: 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 30   = 0;.    rc = 0
3e30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
3e40: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  c;.}../*.** Get 
3e50: 61 20 6e 65 77 20 69 6e 74 65 67 65 72 20 6b 65  a new integer ke
3e60: 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
3e70: 44 62 62 65 4e 65 77 28 44 62 62 65 54 61 62 6c  DbbeNew(DbbeTabl
3e80: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e  e *pTable){.  in
3e90: 74 20 69 4b 65 79 3b 0a 20 20 64 61 74 75 6d 20  t iKey;.  datum 
3ea0: 6b 65 79 3b 0a 20 20 69 6e 74 20 67 6f 20 3d 20  key;.  int go = 
3eb0: 31 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  1;.  int i;.  st
3ec0: 72 75 63 74 20 72 63 34 20 2a 70 52 63 34 3b 0a  ruct rc4 *pRc4;.
3ed0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70  .  if( pTable->p
3ee0: 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c  File==0 || pTabl
3ef0: 65 2d 3e 70 46 69 6c 65 2d 3e 64 62 66 3d 3d 30  e->pFile->dbf==0
3f00: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70   ) return 1;.  p
3f10: 52 63 34 20 3d 20 26 70 54 61 62 6c 65 2d 3e 70  Rc4 = &pTable->p
3f20: 42 65 2d 3e 72 63 34 3b 0a 20 20 77 68 69 6c 65  Be->rc4;.  while
3f30: 28 20 67 6f 20 29 7b 0a 20 20 20 20 69 4b 65 79  ( go ){.    iKey
3f40: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
3f50: 30 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<4; i++){.  
3f60: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
3f70: 3c 3c 38 29 20 2b 20 72 63 34 62 79 74 65 28 70  <<8) + rc4byte(p
3f80: 52 63 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Rc4);.    }.    
3f90: 6b 65 79 2e 64 70 74 72 20 3d 20 28 63 68 61 72  key.dptr = (char
3fa0: 2a 29 26 69 4b 65 79 3b 0a 20 20 20 20 6b 65 79  *)&iKey;.    key
3fb0: 2e 64 73 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20  .dsize = 4;.    
3fc0: 67 6f 20 3d 20 67 64 62 6d 5f 65 78 69 73 74 73  go = gdbm_exists
3fd0: 28 70 54 61 62 6c 65 2d 3e 70 46 69 6c 65 2d 3e  (pTable->pFile->
3fe0: 64 62 66 2c 20 6b 65 79 29 3b 0a 20 20 7d 0a 20  dbf, key);.  }. 
3ff0: 20 72 65 74 75 72 6e 20 69 4b 65 79 3b 0a 7d 20   return iKey;.} 
4000: 20 20 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20    ../*.** Write 
4010: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
4020: 65 20 74 61 62 6c 65 2e 20 20 4f 76 65 72 77 72  e table.  Overwr
4030: 69 74 65 20 61 6e 79 20 70 72 69 6f 72 20 65 6e  ite any prior en
4040: 74 72 79 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  try with the.** 
4050: 73 61 6d 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74  same key..*/.int
4060: 20 73 71 6c 69 74 65 44 62 62 65 50 75 74 28 44   sqliteDbbePut(D
4070: 62 62 65 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  bbeTable *pTable
4080: 2c 20 69 6e 74 20 6e 4b 65 79 2c 63 68 61 72 20  , int nKey,char 
4090: 2a 70 4b 65 79 2c 69 6e 74 20 6e 44 61 74 61 2c  *pKey,int nData,
40a0: 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20  char *pData){.  
40b0: 64 61 74 75 6d 20 64 61 74 61 2c 20 6b 65 79 3b  datum data, key;
40c0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
40d0: 20 70 54 61 62 6c 65 2d 3e 70 46 69 6c 65 3d 3d   pTable->pFile==
40e0: 30 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 70 46 69  0 || pTable->pFi
40f0: 6c 65 2d 3e 64 62 66 3d 3d 30 20 29 20 72 65 74  le->dbf==0 ) ret
4100: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
4110: 3b 0a 20 20 64 61 74 61 2e 64 73 69 7a 65 20 3d  ;.  data.dsize =
4120: 20 6e 44 61 74 61 3b 0a 20 20 64 61 74 61 2e 64   nData;.  data.d
4130: 70 74 72 20 3d 20 70 44 61 74 61 3b 0a 20 20 6b  ptr = pData;.  k
4140: 65 79 2e 64 73 69 7a 65 20 3d 20 6e 4b 65 79 3b  ey.dsize = nKey;
4150: 0a 20 20 6b 65 79 2e 64 70 74 72 20 3d 20 70 4b  .  key.dptr = pK
4160: 65 79 3b 0a 20 20 72 63 20 3d 20 67 64 62 6d 5f  ey;.  rc = gdbm_
4170: 73 74 6f 72 65 28 70 54 61 62 6c 65 2d 3e 70 46  store(pTable->pF
4180: 69 6c 65 2d 3e 64 62 66 2c 20 6b 65 79 2c 20 64  ile->dbf, key, d
4190: 61 74 61 2c 20 47 44 42 4d 5f 52 45 50 4c 41 43  ata, GDBM_REPLAC
41a0: 45 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  E);.  if( rc ) r
41b0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
41c0: 3b 0a 20 20 64 61 74 75 6d 43 6c 65 61 72 28 26  ;.  datumClear(&
41d0: 70 54 61 62 6c 65 2d 3e 6b 65 79 29 3b 0a 20 20  pTable->key);.  
41e0: 64 61 74 75 6d 43 6c 65 61 72 28 26 70 54 61 62  datumClear(&pTab
41f0: 6c 65 2d 3e 64 61 74 61 29 3b 0a 20 20 72 65 74  le->data);.  ret
4200: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4210: 20 52 65 6d 6f 76 65 20 61 6e 20 65 6e 74 72 79   Remove an entry
4220: 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 2c 20 69   from a table, i
4230: 66 20 74 68 65 20 65 6e 74 72 79 20 65 78 69 73  f the entry exis
4240: 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
4250: 65 44 62 62 65 44 65 6c 65 74 65 28 44 62 62 65  eDbbeDelete(Dbbe
4260: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 2c 20 69  Table *pTable, i
4270: 6e 74 20 6e 4b 65 79 2c 20 63 68 61 72 20 2a 70  nt nKey, char *p
4280: 4b 65 79 29 7b 0a 20 20 64 61 74 75 6d 20 6b 65  Key){.  datum ke
4290: 79 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  y;.  int rc;.  d
42a0: 61 74 75 6d 43 6c 65 61 72 28 26 70 54 61 62 6c  atumClear(&pTabl
42b0: 65 2d 3e 6b 65 79 29 3b 0a 20 20 64 61 74 75 6d  e->key);.  datum
42c0: 43 6c 65 61 72 28 26 70 54 61 62 6c 65 2d 3e 64  Clear(&pTable->d
42d0: 61 74 61 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ata);.  if( pTab
42e0: 6c 65 2d 3e 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  le->pFile==0 || 
42f0: 70 54 61 62 6c 65 2d 3e 70 46 69 6c 65 2d 3e 64  pTable->pFile->d
4300: 62 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  bf==0 ) return S
4310: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 6b  QLITE_ERROR;.  k
4320: 65 79 2e 64 73 69 7a 65 20 3d 20 6e 4b 65 79 3b  ey.dsize = nKey;
4330: 0a 20 20 6b 65 79 2e 64 70 74 72 20 3d 20 70 4b  .  key.dptr = pK
4340: 65 79 3b 0a 20 20 72 63 20 3d 20 67 64 62 6d 5f  ey;.  rc = gdbm_
4350: 64 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70  delete(pTable->p
4360: 46 69 6c 65 2d 3e 64 62 66 2c 20 6b 65 79 29 3b  File->dbf, key);
4370: 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d  .  if( rc ) rc =
4380: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
4390: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
43a0: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
43b0: 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 65  orary file.  The
43c0: 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
43d0: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63 6c 6f  deleted when clo
43e0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  sed..**.** Note 
43f0: 74 68 61 74 20 77 65 20 63 61 6e 27 74 20 75 73  that we can't us
4400: 65 20 74 68 65 20 6f 6c 64 20 55 6e 69 78 20 74  e the old Unix t
4410: 72 69 63 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20  rick of opening 
4420: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  the file.** and 
4430: 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  then immediately
4440: 20 75 6e 6c 69 6e 6b 69 6e 67 20 74 68 65 20 66   unlinking the f
4450: 69 6c 65 2e 20 20 54 68 61 74 20 77 6f 72 6b 73  ile.  That works
4460: 20 67 72 65 61 74 0a 2a 2a 20 75 6e 64 65 72 20   great.** under 
4470: 55 6e 69 78 2c 20 62 75 74 20 66 61 69 6c 73 20  Unix, but fails 
4480: 77 68 65 6e 20 77 65 20 74 72 79 20 74 6f 20 70  when we try to p
4490: 6f 72 74 20 74 6f 20 57 69 6e 64 6f 77 73 2e 0a  ort to Windows..
44a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 44 62 62  */.int sqliteDbb
44b0: 65 4f 70 65 6e 54 65 6d 70 46 69 6c 65 28 44 62  eOpenTempFile(Db
44c0: 62 65 20 2a 70 42 65 2c 20 46 49 4c 45 20 2a 2a  be *pBe, FILE **
44d0: 70 70 46 69 6c 65 29 7b 0a 20 20 63 68 61 72 20  ppFile){.  char 
44e0: 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  *zFile;         
44f0: 2f 2a 20 46 75 6c 6c 20 6e 61 6d 65 20 6f 66 20  /* Full name of 
4500: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
4510: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 7a 42 75  le */.  char zBu
4520: 66 5b 35 30 5d 3b 20 20 20 20 20 20 20 2f 2a 20  f[50];       /* 
4530: 42 61 73 65 20 6e 61 6d 65 20 6f 66 20 74 68 65  Base name of the
4540: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
4550: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
4560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
4570: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
4580: 6e 74 20 6c 69 6d 69 74 3b 20 20 20 20 20 20 20  nt limit;       
4590: 20 20 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 61      /* Prevent a
45a0: 6e 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 20  n infinite loop 
45b0: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
45c0: 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 56 61 6c  LITE_OK;  /* Val
45d0: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
45e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
45f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 42  .  for(i=0; i<pB
4600: 65 2d 3e 6e 54 65 6d 70 3b 20 69 2b 2b 29 7b 0a  e->nTemp; i++){.
4610: 20 20 20 20 69 66 28 20 70 42 65 2d 3e 61 70 54      if( pBe->apT
4620: 65 6d 70 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61  emp[i]==0 ) brea
4630: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d  k;.  }.  if( i>=
4640: 70 42 65 2d 3e 6e 54 65 6d 70 20 29 7b 0a 20 20  pBe->nTemp ){.  
4650: 20 20 70 42 65 2d 3e 6e 54 65 6d 70 2b 2b 3b 0a    pBe->nTemp++;.
4660: 20 20 20 20 70 42 65 2d 3e 61 70 54 65 6d 70 20      pBe->apTemp 
4670: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
4680: 70 42 65 2d 3e 61 70 54 65 6d 70 2c 20 70 42 65  pBe->apTemp, pBe
4690: 2d 3e 6e 54 65 6d 70 2a 73 69 7a 65 6f 66 28 46  ->nTemp*sizeof(F
46a0: 49 4c 45 2a 29 20 29 3b 0a 20 20 20 20 70 42 65  ILE*) );.    pBe
46b0: 2d 3e 61 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74  ->azTemp = sqlit
46c0: 65 52 65 61 6c 6c 6f 63 28 70 42 65 2d 3e 61 7a  eRealloc(pBe->az
46d0: 54 65 6d 70 2c 20 70 42 65 2d 3e 6e 54 65 6d 70  Temp, pBe->nTemp
46e0: 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 29  *sizeof(char*) )
46f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 65 2d  ;.  }.  if( pBe-
4700: 3e 61 70 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  >apTemp==0 ){.  
4710: 20 20 2a 70 70 46 69 6c 65 20 3d 20 30 3b 0a 20    *ppFile = 0;. 
4720: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4730: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6c 69  _NOMEM;.  }.  li
4740: 6d 69 74 20 3d 20 34 3b 0a 20 20 7a 46 69 6c 65  mit = 4;.  zFile
4750: 20 3d 20 30 3b 0a 20 20 64 6f 7b 0a 20 20 20 20   = 0;.  do{.    
4760: 72 61 6e 64 6f 6d 4e 61 6d 65 28 26 70 42 65 2d  randomName(&pBe-
4770: 3e 72 63 34 2c 20 7a 42 75 66 2c 20 22 2f 5f 74  >rc4, zBuf, "/_t
4780: 65 6d 70 5f 66 69 6c 65 5f 22 29 3b 0a 20 20 20  emp_file_");.   
4790: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 69 6c   sqliteFree(zFil
47a0: 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20  e);.    zFile = 
47b0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  0;.    sqliteSet
47c0: 53 74 72 69 6e 67 28 26 7a 46 69 6c 65 2c 20 70  String(&zFile, p
47d0: 42 65 2d 3e 7a 44 69 72 2c 20 7a 42 75 66 2c 20  Be->zDir, zBuf, 
47e0: 30 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 61 63  0);.  }while( ac
47f0: 63 65 73 73 28 7a 46 69 6c 65 2c 30 29 3d 3d 30  cess(zFile,0)==0
4800: 20 26 26 20 6c 69 6d 69 74 2d 2d 20 3e 3d 20 30   && limit-- >= 0
4810: 20 29 3b 0a 20 20 2a 70 70 46 69 6c 65 20 3d 20   );.  *ppFile = 
4820: 70 42 65 2d 3e 61 70 54 65 6d 70 5b 69 5d 20 3d  pBe->apTemp[i] =
4830: 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 77   fopen(zFile, "w
4840: 2b 22 29 3b 0a 20 20 69 66 28 20 70 42 65 2d 3e  +");.  if( pBe->
4850: 61 70 54 65 6d 70 5b 69 5d 3d 3d 30 20 29 7b 0a  apTemp[i]==0 ){.
4860: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4870: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
4880: 65 46 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20  eFree(zFile);.  
4890: 20 20 70 42 65 2d 3e 61 7a 54 65 6d 70 5b 69 5d    pBe->azTemp[i]
48a0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
48b0: 20 20 20 70 42 65 2d 3e 61 7a 54 65 6d 70 5b 69     pBe->azTemp[i
48c0: 5d 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 7d 0a 20  ] = zFile;.  }. 
48d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
48e0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 74 65 6d  *.** Close a tem
48f0: 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 70 65 6e  porary file open
4900: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 44  ed using sqliteD
4910: 62 62 65 4f 70 65 6e 54 65 6d 70 46 69 6c 65 28  bbeOpenTempFile(
4920: 29 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ).*/.void sqlite
4930: 44 62 62 65 43 6c 6f 73 65 54 65 6d 70 46 69 6c  DbbeCloseTempFil
4940: 65 28 44 62 62 65 20 2a 70 42 65 2c 20 46 49 4c  e(Dbbe *pBe, FIL
4950: 45 20 2a 66 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  E *f){.  int i;.
4960: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 42 65    for(i=0; i<pBe
4970: 2d 3e 6e 54 65 6d 70 3b 20 69 2b 2b 29 7b 0a 20  ->nTemp; i++){. 
4980: 20 20 20 69 66 28 20 70 42 65 2d 3e 61 70 54 65     if( pBe->apTe
4990: 6d 70 5b 69 5d 3d 3d 66 20 29 7b 0a 20 20 20 20  mp[i]==f ){.    
49a0: 20 20 75 6e 6c 69 6e 6b 28 70 42 65 2d 3e 61 7a    unlink(pBe->az
49b0: 54 65 6d 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Temp[i]);.      
49c0: 73 71 6c 69 74 65 46 72 65 65 28 70 42 65 2d 3e  sqliteFree(pBe->
49d0: 61 7a 54 65 6d 70 5b 69 5d 29 3b 0a 20 20 20 20  azTemp[i]);.    
49e0: 20 20 70 42 65 2d 3e 61 70 54 65 6d 70 5b 69 5d    pBe->apTemp[i]
49f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 42 65 2d   = 0;.      pBe-
4a00: 3e 61 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a  >azTemp[i] = 0;.
4a10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4a20: 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28   }.  }.  fclose(
4a30: 66 29 3b 0a 7d 0a                                f);.}.