/ Hex Artifact Content
Login

Artifact 3cbad7ce525aec925f8fda2192d576d47f0d478a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 39 20 41 75 67 75 73  /*.** 2009 Augus
0010: 74 20 31 37 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 17.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ***.**.** The co
0180: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
0190: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
01a0: 69 6e 67 20 53 51 4c 69 74 65 2e 20 49 74 20 69  ing SQLite. It i
01b0: 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 0a 2a 2a  s not part of.**
01c0: 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65   the source code
01d0: 20 75 73 65 64 20 69 6e 20 70 72 6f 64 75 63 74   used in product
01e0: 69 6f 6e 20 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a  ion systems..**.
01f0: 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  ** Specifically,
0200: 20 74 68 69 73 20 66 69 6c 65 20 74 65 73 74 73   this file tests
0210: 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 65   the effect of e
0220: 72 72 6f 72 73 20 77 68 69 6c 65 20 69 6e 69 74  rrors while init
0230: 69 61 6c 69 7a 69 6e 67 0a 2a 2a 20 74 68 65 20  ializing.** the 
0240: 76 61 72 69 6f 75 73 20 70 6c 75 67 67 61 62 6c  various pluggabl
0250: 65 20 73 75 62 2d 73 79 73 74 65 6d 73 20 66 72  e sub-systems fr
0260: 6f 6d 20 77 69 74 68 69 6e 20 73 71 6c 69 74 65  om within sqlite
0270: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a  3_initialize()..
0280: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
0290: 63 63 75 72 73 20 69 6e 20 73 71 6c 69 74 65 33  ccurs in sqlite3
02a0: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 74 68  _initialize() th
02b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 68 6f 75  e following shou
02c0: 6c 64 20 62 65 0a 2a 2a 20 74 72 75 65 3a 0a 2a  ld be.** true:.*
02d0: 2a 0a 2a 2a 20 20 20 31 29 20 41 6e 20 65 72 72  *.**   1) An err
02e0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
02f0: 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c  ned to the user,
0300: 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20 41 20 73   and.**   2) A s
0310: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74  ubsequent call t
0320: 6f 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  o sqlite3_shutdo
0330: 77 6e 28 29 20 63 61 6c 6c 73 20 74 68 65 20 73  wn() calls the s
0340: 68 75 74 64 6f 77 6e 20 6d 65 74 68 6f 64 0a 2a  hutdown method.*
0350: 2a 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65 20  *      of those 
0360: 73 75 62 73 79 73 74 65 6d 73 20 74 68 61 74 20  subsystems that 
0370: 77 65 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  were initialized
0380: 2c 20 61 6e 64 0a 2a 2a 20 20 20 33 29 20 41 20  , and.**   3) A 
0390: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20  subsequent call 
03a0: 74 6f 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  to sqlite3_initi
03b0: 61 6c 69 7a 65 28 29 20 61 74 74 65 6d 70 74 73  alize() attempts
03c0: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a   to initialize.*
03d0: 2a 20 20 20 20 20 20 74 68 65 20 72 65 6d 61 69  *      the remai
03e0: 6e 69 6e 67 2c 20 75 6e 69 6e 69 74 69 61 6c 69  ning, uninitiali
03f0: 7a 65 64 2c 20 73 75 62 73 79 73 74 65 6d 73 2e  zed, subsystems.
0400: 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73  .*/..#include "s
0410: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0420: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
0430: 23 69 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68 3e  #include <tcl.h>
0440: 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
0450: 57 72 61 70 70 65 64 20 7b 0a 20 20 73 71 6c 69  Wrapped {.  sqli
0460: 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f  te3_pcache_metho
0470: 64 73 32 20 70 63 61 63 68 65 3b 0a 20 20 73 71  ds2 pcache;.  sq
0480: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
0490: 73 20 20 20 20 20 6d 65 6d 3b 0a 20 20 73 71 6c  s     mem;.  sql
04a0: 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f  ite3_mutex_metho
04b0: 64 73 20 20 20 6d 75 74 65 78 3b 0a 0a 20 20 69  ds   mutex;..  i
04c0: 6e 74 20 6d 65 6d 5f 69 6e 69 74 3b 20 20 20 20  nt mem_init;    
04d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
04e0: 72 75 65 20 69 66 20 6d 65 6d 20 73 75 62 73 79  rue if mem subsy
04f0: 73 74 65 6d 20 69 73 20 69 6e 69 74 61 6c 69 7a  stem is initaliz
0500: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 5f  ed */.  int mem_
0510: 66 61 69 6c 3b 20 20 20 20 20 20 20 20 20 20 20  fail;           
0520: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
0530: 66 61 69 6c 20 6d 65 6d 20 73 75 62 73 79 73 74  fail mem subsyst
0540: 65 6d 20 69 6e 69 61 6c 69 7a 61 74 69 6f 6e 20  em inialization 
0550: 2a 2f 0a 20 20 69 6e 74 20 6d 75 74 65 78 5f 69  */.  int mutex_i
0560: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
0570: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6d 75 74    /* True if mut
0580: 65 78 20 73 75 62 73 79 73 74 65 6d 20 69 73 20  ex subsystem is 
0590: 69 6e 69 74 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  initalized */.  
05a0: 69 6e 74 20 6d 75 74 65 78 5f 66 61 69 6c 3b 20  int mutex_fail; 
05b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
05c0: 54 72 75 65 20 74 6f 20 66 61 69 6c 20 6d 75 74  True to fail mut
05d0: 65 78 20 73 75 62 73 79 73 74 65 6d 20 69 6e 69  ex subsystem ini
05e0: 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  alization */.  i
05f0: 6e 74 20 70 63 61 63 68 65 5f 69 6e 69 74 3b 20  nt pcache_init; 
0600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0610: 72 75 65 20 69 66 20 70 63 61 63 68 65 20 73 75  rue if pcache su
0620: 62 73 79 73 74 65 6d 20 69 73 20 69 6e 69 74 61  bsystem is inita
0630: 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 70  lized */.  int p
0640: 63 61 63 68 65 5f 66 61 69 6c 3b 20 20 20 20 20  cache_fail;     
0650: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
0660: 74 6f 20 66 61 69 6c 20 70 63 61 63 68 65 20 73  to fail pcache s
0670: 75 62 73 79 73 74 65 6d 20 69 6e 69 61 6c 69 7a  ubsystem inializ
0680: 61 74 69 6f 6e 20 2a 2f 0a 7d 20 77 72 61 70 70  ation */.} wrapp
0690: 65 64 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ed;..static int 
06a0: 77 72 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a  wrMemInit(void *
06b0: 70 41 70 70 44 61 74 61 29 7b 0a 20 20 69 6e 74  pAppData){.  int
06c0: 20 72 63 3b 0a 20 20 69 66 28 20 77 72 61 70 70   rc;.  if( wrapp
06d0: 65 64 2e 6d 65 6d 5f 66 61 69 6c 20 29 7b 0a 20  ed.mem_fail ){. 
06e0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
06f0: 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
0700: 20 20 20 72 63 20 3d 20 77 72 61 70 70 65 64 2e     rc = wrapped.
0710: 6d 65 6d 2e 78 49 6e 69 74 28 77 72 61 70 70 65  mem.xInit(wrappe
0720: 64 2e 6d 65 6d 2e 70 41 70 70 44 61 74 61 29 3b  d.mem.pAppData);
0730: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
0740: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
0750: 77 72 61 70 70 65 64 2e 6d 65 6d 5f 69 6e 69 74  wrapped.mem_init
0760: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
0770: 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
0780: 76 6f 69 64 20 77 72 4d 65 6d 53 68 75 74 64 6f  void wrMemShutdo
0790: 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  wn(void *pAppDat
07a0: 61 29 7b 0a 20 20 77 72 61 70 70 65 64 2e 6d 65  a){.  wrapped.me
07b0: 6d 2e 78 53 68 75 74 64 6f 77 6e 28 77 72 61 70  m.xShutdown(wrap
07c0: 70 65 64 2e 6d 65 6d 2e 70 41 70 70 44 61 74 61  ped.mem.pAppData
07d0: 29 3b 0a 20 20 77 72 61 70 70 65 64 2e 6d 65 6d  );.  wrapped.mem
07e0: 5f 69 6e 69 74 20 3d 20 30 3b 0a 7d 0a 73 74 61  _init = 0;.}.sta
07f0: 74 69 63 20 76 6f 69 64 20 2a 77 72 4d 65 6d 4d  tic void *wrMemM
0800: 61 6c 6c 6f 63 28 69 6e 74 20 6e 29 20 20 20 20  alloc(int n)    
0810: 20 20 20 20 20 20 20 7b 72 65 74 75 72 6e 20 77         {return w
0820: 72 61 70 70 65 64 2e 6d 65 6d 2e 78 4d 61 6c 6c  rapped.mem.xMall
0830: 6f 63 28 6e 29 3b 7d 0a 73 74 61 74 69 63 20 76  oc(n);}.static v
0840: 6f 69 64 20 77 72 4d 65 6d 46 72 65 65 28 76 6f  oid wrMemFree(vo
0850: 69 64 20 2a 70 29 20 20 20 20 20 20 20 20 20 20  id *p)          
0860: 20 20 7b 77 72 61 70 70 65 64 2e 6d 65 6d 2e 78    {wrapped.mem.x
0870: 46 72 65 65 28 70 29 3b 7d 0a 73 74 61 74 69 63  Free(p);}.static
0880: 20 76 6f 69 64 20 2a 77 72 4d 65 6d 52 65 61 6c   void *wrMemReal
0890: 6c 6f 63 28 76 6f 69 64 20 2a 70 2c 20 69 6e 74  loc(void *p, int
08a0: 20 6e 29 20 7b 72 65 74 75 72 6e 20 77 72 61 70   n) {return wrap
08b0: 70 65 64 2e 6d 65 6d 2e 78 52 65 61 6c 6c 6f 63  ped.mem.xRealloc
08c0: 28 70 2c 20 6e 29 3b 7d 0a 73 74 61 74 69 63 20  (p, n);}.static 
08d0: 69 6e 74 20 77 72 4d 65 6d 53 69 7a 65 28 76 6f  int wrMemSize(vo
08e0: 69 64 20 2a 70 29 20 20 20 20 20 20 20 20 20 20  id *p)          
08f0: 20 20 20 7b 72 65 74 75 72 6e 20 77 72 61 70 70     {return wrapp
0900: 65 64 2e 6d 65 6d 2e 78 53 69 7a 65 28 70 29 3b  ed.mem.xSize(p);
0910: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 4d  }.static int wrM
0920: 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29  emRoundup(int n)
0930: 20 20 20 20 20 20 20 20 20 20 20 20 7b 72 65 74              {ret
0940: 75 72 6e 20 77 72 61 70 70 65 64 2e 6d 65 6d 2e  urn wrapped.mem.
0950: 78 52 6f 75 6e 64 75 70 28 6e 29 3b 7d 0a 0a 0a  xRoundup(n);}...
0960: 73 74 61 74 69 63 20 69 6e 74 20 77 72 4d 75 74  static int wrMut
0970: 65 78 49 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20  exInit(void){.  
0980: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 77 72  int rc;.  if( wr
0990: 61 70 70 65 64 2e 6d 75 74 65 78 5f 66 61 69 6c  apped.mutex_fail
09a0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
09b0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  ITE_ERROR;.  }el
09c0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 77 72 61  se{.    rc = wra
09d0: 70 70 65 64 2e 6d 75 74 65 78 2e 78 4d 75 74 65  pped.mutex.xMute
09e0: 78 49 6e 69 74 28 29 3b 0a 20 20 7d 0a 20 20 69  xInit();.  }.  i
09f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
0a00: 20 29 7b 0a 20 20 20 20 77 72 61 70 70 65 64 2e   ){.    wrapped.
0a10: 6d 75 74 65 78 5f 69 6e 69 74 20 3d 20 31 3b 0a  mutex_init = 1;.
0a20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
0a30: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  .}.static int wr
0a40: 4d 75 74 65 78 45 6e 64 28 76 6f 69 64 29 7b 0a  MutexEnd(void){.
0a50: 20 20 77 72 61 70 70 65 64 2e 6d 75 74 65 78 2e    wrapped.mutex.
0a60: 78 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20 77  xMutexEnd();.  w
0a70: 72 61 70 70 65 64 2e 6d 75 74 65 78 5f 69 6e 69  rapped.mutex_ini
0a80: 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
0a90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
0aa0: 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  tic sqlite3_mute
0ab0: 78 20 2a 77 72 4d 75 74 65 78 41 6c 6c 6f 63 28  x *wrMutexAlloc(
0ac0: 69 6e 74 20 65 29 7b 0a 20 20 72 65 74 75 72 6e  int e){.  return
0ad0: 20 77 72 61 70 70 65 64 2e 6d 75 74 65 78 2e 78   wrapped.mutex.x
0ae0: 4d 75 74 65 78 41 6c 6c 6f 63 28 65 29 3b 0a 7d  MutexAlloc(e);.}
0af0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 72 4d  .static void wrM
0b00: 75 74 65 78 46 72 65 65 28 73 71 6c 69 74 65 33  utexFree(sqlite3
0b10: 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20 77 72  _mutex *p){.  wr
0b20: 61 70 70 65 64 2e 6d 75 74 65 78 2e 78 4d 75 74  apped.mutex.xMut
0b30: 65 78 46 72 65 65 28 70 29 3b 0a 7d 0a 73 74 61  exFree(p);.}.sta
0b40: 74 69 63 20 76 6f 69 64 20 77 72 4d 75 74 65 78  tic void wrMutex
0b50: 45 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75  Enter(sqlite3_mu
0b60: 74 65 78 20 2a 70 29 7b 0a 20 20 77 72 61 70 70  tex *p){.  wrapp
0b70: 65 64 2e 6d 75 74 65 78 2e 78 4d 75 74 65 78 45  ed.mutex.xMutexE
0b80: 6e 74 65 72 28 70 29 3b 0a 7d 0a 73 74 61 74 69  nter(p);.}.stati
0b90: 63 20 69 6e 74 20 77 72 4d 75 74 65 78 54 72 79  c int wrMutexTry
0ba0: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a  (sqlite3_mutex *
0bb0: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 77 72 61  p){.  return wra
0bc0: 70 70 65 64 2e 6d 75 74 65 78 2e 78 4d 75 74 65  pped.mutex.xMute
0bd0: 78 54 72 79 28 70 29 3b 0a 7d 0a 73 74 61 74 69  xTry(p);.}.stati
0be0: 63 20 76 6f 69 64 20 77 72 4d 75 74 65 78 4c 65  c void wrMutexLe
0bf0: 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  ave(sqlite3_mute
0c00: 78 20 2a 70 29 7b 0a 20 20 77 72 61 70 70 65 64  x *p){.  wrapped
0c10: 2e 6d 75 74 65 78 2e 78 4d 75 74 65 78 4c 65 61  .mutex.xMutexLea
0c20: 76 65 28 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20  ve(p);.}.static 
0c30: 69 6e 74 20 77 72 4d 75 74 65 78 48 65 6c 64 28  int wrMutexHeld(
0c40: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
0c50: 29 7b 0a 20 20 72 65 74 75 72 6e 20 77 72 61 70  ){.  return wrap
0c60: 70 65 64 2e 6d 75 74 65 78 2e 78 4d 75 74 65 78  ped.mutex.xMutex
0c70: 48 65 6c 64 28 70 29 3b 0a 7d 0a 73 74 61 74 69  Held(p);.}.stati
0c80: 63 20 69 6e 74 20 77 72 4d 75 74 65 78 4e 6f 74  c int wrMutexNot
0c90: 68 65 6c 64 28 73 71 6c 69 74 65 33 5f 6d 75 74  held(sqlite3_mut
0ca0: 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ex *p){.  return
0cb0: 20 77 72 61 70 70 65 64 2e 6d 75 74 65 78 2e 78   wrapped.mutex.x
0cc0: 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28 70 29 3b  MutexNotheld(p);
0cd0: 0a 7d 0a 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74  .}....static int
0ce0: 20 77 72 50 43 61 63 68 65 49 6e 69 74 28 76 6f   wrPCacheInit(vo
0cf0: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74  id *pArg){.  int
0d00: 20 72 63 3b 0a 20 20 69 66 28 20 77 72 61 70 70   rc;.  if( wrapp
0d10: 65 64 2e 70 63 61 63 68 65 5f 66 61 69 6c 20 29  ed.pcache_fail )
0d20: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
0d30: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  E_ERROR;.  }else
0d40: 7b 0a 20 20 20 20 72 63 20 3d 20 77 72 61 70 70  {.    rc = wrapp
0d50: 65 64 2e 70 63 61 63 68 65 2e 78 49 6e 69 74 28  ed.pcache.xInit(
0d60: 77 72 61 70 70 65 64 2e 70 63 61 63 68 65 2e 70  wrapped.pcache.p
0d70: 41 72 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Arg);.  }.  if( 
0d80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
0d90: 0a 20 20 20 20 77 72 61 70 70 65 64 2e 70 63 61  .    wrapped.pca
0da0: 63 68 65 5f 69 6e 69 74 20 3d 20 31 3b 0a 20 20  che_init = 1;.  
0db0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
0dc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 72 50  .static void wrP
0dd0: 43 61 63 68 65 53 68 75 74 64 6f 77 6e 28 76 6f  CacheShutdown(vo
0de0: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 72 61  id *pArg){.  wra
0df0: 70 70 65 64 2e 70 63 61 63 68 65 2e 78 53 68 75  pped.pcache.xShu
0e00: 74 64 6f 77 6e 28 77 72 61 70 70 65 64 2e 70 63  tdown(wrapped.pc
0e10: 61 63 68 65 2e 70 41 72 67 29 3b 0a 20 20 77 72  ache.pArg);.  wr
0e20: 61 70 70 65 64 2e 70 63 61 63 68 65 5f 69 6e 69  apped.pcache_ini
0e30: 74 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63  t = 0;.}..static
0e40: 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 20   sqlite3_pcache 
0e50: 2a 77 72 50 43 61 63 68 65 43 72 65 61 74 65 28  *wrPCacheCreate(
0e60: 69 6e 74 20 61 2c 20 69 6e 74 20 62 2c 20 69 6e  int a, int b, in
0e70: 74 20 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 77  t c){.  return w
0e80: 72 61 70 70 65 64 2e 70 63 61 63 68 65 2e 78 43  rapped.pcache.xC
0e90: 72 65 61 74 65 28 61 2c 20 62 2c 20 63 29 3b 0a  reate(a, b, c);.
0ea0: 7d 20 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }  .static void 
0eb0: 77 72 50 43 61 63 68 65 43 61 63 68 65 73 69 7a  wrPCacheCachesiz
0ec0: 65 28 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  e(sqlite3_pcache
0ed0: 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77   *p, int n){.  w
0ee0: 72 61 70 70 65 64 2e 70 63 61 63 68 65 2e 78 43  rapped.pcache.xC
0ef0: 61 63 68 65 73 69 7a 65 28 70 2c 20 6e 29 3b 0a  achesize(p, n);.
0f00: 7d 20 20 0a 73 74 61 74 69 63 20 69 6e 74 20 77  }  .static int w
0f10: 72 50 43 61 63 68 65 50 61 67 65 63 6f 75 6e 74  rPCachePagecount
0f20: 28 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 20  (sqlite3_pcache 
0f30: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 77 72  *p){.  return wr
0f40: 61 70 70 65 64 2e 70 63 61 63 68 65 2e 78 50 61  apped.pcache.xPa
0f50: 67 65 63 6f 75 6e 74 28 70 29 3b 0a 7d 20 20 0a  gecount(p);.}  .
0f60: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 70  static sqlite3_p
0f70: 63 61 63 68 65 5f 70 61 67 65 20 2a 77 72 50 43  cache_page *wrPC
0f80: 61 63 68 65 46 65 74 63 68 28 73 71 6c 69 74 65  acheFetch(sqlite
0f90: 33 5f 70 63 61 63 68 65 20 2a 70 2c 20 75 6e 73  3_pcache *p, uns
0fa0: 69 67 6e 65 64 20 61 2c 20 69 6e 74 20 62 29 7b  igned a, int b){
0fb0: 0a 20 20 72 65 74 75 72 6e 20 77 72 61 70 70 65  .  return wrappe
0fc0: 64 2e 70 63 61 63 68 65 2e 78 46 65 74 63 68 28  d.pcache.xFetch(
0fd0: 70 2c 20 61 2c 20 62 29 3b 0a 7d 20 20 0a 73 74  p, a, b);.}  .st
0fe0: 61 74 69 63 20 76 6f 69 64 20 77 72 50 43 61 63  atic void wrPCac
0ff0: 68 65 55 6e 70 69 6e 28 73 71 6c 69 74 65 33 5f  heUnpin(sqlite3_
1000: 70 63 61 63 68 65 20 2a 70 2c 20 73 71 6c 69 74  pcache *p, sqlit
1010: 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a  e3_pcache_page *
1020: 61 2c 20 69 6e 74 20 62 29 7b 0a 20 20 77 72 61  a, int b){.  wra
1030: 70 70 65 64 2e 70 63 61 63 68 65 2e 78 55 6e 70  pped.pcache.xUnp
1040: 69 6e 28 70 2c 20 61 2c 20 62 29 3b 0a 7d 20 20  in(p, a, b);.}  
1050: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 72 50  .static void wrP
1060: 43 61 63 68 65 52 65 6b 65 79 28 0a 20 20 73 71  CacheRekey(.  sq
1070: 6c 69 74 65 33 5f 70 63 61 63 68 65 20 2a 70 2c  lite3_pcache *p,
1080: 20 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63   .  sqlite3_pcac
1090: 68 65 5f 70 61 67 65 20 2a 61 2c 20 0a 20 20 75  he_page *a, .  u
10a0: 6e 73 69 67 6e 65 64 20 62 2c 20 0a 20 20 75 6e  nsigned b, .  un
10b0: 73 69 67 6e 65 64 20 63 0a 29 7b 0a 20 20 77 72  signed c.){.  wr
10c0: 61 70 70 65 64 2e 70 63 61 63 68 65 2e 78 52 65  apped.pcache.xRe
10d0: 6b 65 79 28 70 2c 20 61 2c 20 62 2c 20 63 29 3b  key(p, a, b, c);
10e0: 0a 7d 20 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .}  .static void
10f0: 20 77 72 50 43 61 63 68 65 54 72 75 6e 63 61 74   wrPCacheTruncat
1100: 65 28 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  e(sqlite3_pcache
1110: 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64 20 61 29   *p, unsigned a)
1120: 7b 0a 20 20 77 72 61 70 70 65 64 2e 70 63 61 63  {.  wrapped.pcac
1130: 68 65 2e 78 54 72 75 6e 63 61 74 65 28 70 2c 20  he.xTruncate(p, 
1140: 61 29 3b 0a 7d 20 20 0a 73 74 61 74 69 63 20 76  a);.}  .static v
1150: 6f 69 64 20 77 72 50 43 61 63 68 65 44 65 73 74  oid wrPCacheDest
1160: 72 6f 79 28 73 71 6c 69 74 65 33 5f 70 63 61 63  roy(sqlite3_pcac
1170: 68 65 20 2a 70 29 7b 0a 20 20 77 72 61 70 70 65  he *p){.  wrappe
1180: 64 2e 70 63 61 63 68 65 2e 78 44 65 73 74 72 6f  d.pcache.xDestro
1190: 79 28 70 29 3b 0a 7d 20 20 0a 0a 73 74 61 74 69  y(p);.}  ..stati
11a0: 63 20 76 6f 69 64 20 69 6e 73 74 61 6c 6c 49 6e  c void installIn
11b0: 69 74 57 72 61 70 70 65 72 73 28 76 6f 69 64 29  itWrappers(void)
11c0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
11d0: 78 5f 6d 65 74 68 6f 64 73 20 6d 75 74 65 78 6d  x_methods mutexm
11e0: 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77  ethods = {.    w
11f0: 72 4d 75 74 65 78 49 6e 69 74 2c 20 20 77 72 4d  rMutexInit,  wrM
1200: 75 74 65 78 45 6e 64 2c 20 20 20 77 72 4d 75 74  utexEnd,   wrMut
1210: 65 78 41 6c 6c 6f 63 2c 0a 20 20 20 20 77 72 4d  exAlloc,.    wrM
1220: 75 74 65 78 46 72 65 65 2c 20 20 77 72 4d 75 74  utexFree,  wrMut
1230: 65 78 45 6e 74 65 72 2c 20 77 72 4d 75 74 65 78  exEnter, wrMutex
1240: 54 72 79 2c 0a 20 20 20 20 77 72 4d 75 74 65 78  Try,.    wrMutex
1250: 4c 65 61 76 65 2c 20 77 72 4d 75 74 65 78 48 65  Leave, wrMutexHe
1260: 6c 64 2c 20 20 77 72 4d 75 74 65 78 4e 6f 74 68  ld,  wrMutexNoth
1270: 65 6c 64 0a 20 20 7d 3b 0a 20 20 73 71 6c 69 74  eld.  };.  sqlit
1280: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
1290: 73 32 20 70 63 61 63 68 65 6d 65 74 68 6f 64 73  s2 pcachemethods
12a0: 20 3d 20 7b 0a 20 20 20 20 31 2c 20 30 2c 0a 20   = {.    1, 0,. 
12b0: 20 20 20 77 72 50 43 61 63 68 65 49 6e 69 74 2c     wrPCacheInit,
12c0: 20 20 20 20 20 20 77 72 50 43 61 63 68 65 53 68        wrPCacheSh
12d0: 75 74 64 6f 77 6e 2c 20 20 77 72 50 43 61 63 68  utdown,  wrPCach
12e0: 65 43 72 65 61 74 65 2c 20 0a 20 20 20 20 77 72  eCreate, .    wr
12f0: 50 43 61 63 68 65 43 61 63 68 65 73 69 7a 65 2c  PCacheCachesize,
1300: 20 77 72 50 43 61 63 68 65 50 61 67 65 63 6f 75   wrPCachePagecou
1310: 6e 74 2c 20 77 72 50 43 61 63 68 65 46 65 74 63  nt, wrPCacheFetc
1320: 68 2c 0a 20 20 20 20 77 72 50 43 61 63 68 65 55  h,.    wrPCacheU
1330: 6e 70 69 6e 2c 20 20 20 20 20 77 72 50 43 61 63  npin,     wrPCac
1340: 68 65 52 65 6b 65 79 2c 20 20 20 20 20 77 72 50  heRekey,     wrP
1350: 43 61 63 68 65 54 72 75 6e 63 61 74 65 2c 20 20  CacheTruncate,  
1360: 0a 20 20 20 20 77 72 50 43 61 63 68 65 44 65 73  .    wrPCacheDes
1370: 74 72 6f 79 0a 20 20 7d 3b 0a 20 20 73 71 6c 69  troy.  };.  sqli
1380: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
1390: 6d 65 6d 6d 65 74 68 6f 64 73 20 3d 20 7b 0a 20  memmethods = {. 
13a0: 20 20 20 77 72 4d 65 6d 4d 61 6c 6c 6f 63 2c 20     wrMemMalloc, 
13b0: 20 20 77 72 4d 65 6d 46 72 65 65 2c 20 20 20 20    wrMemFree,    
13c0: 77 72 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20  wrMemRealloc,.  
13d0: 20 20 77 72 4d 65 6d 53 69 7a 65 2c 20 20 20 20    wrMemSize,    
13e0: 20 77 72 4d 65 6d 52 6f 75 6e 64 75 70 2c 20 77   wrMemRoundup, w
13f0: 72 4d 65 6d 49 6e 69 74 2c 0a 20 20 20 20 77 72  rMemInit,.    wr
1400: 4d 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20  MemShutdown,.   
1410: 20 30 0a 20 20 7d 3b 0a 0a 20 20 6d 65 6d 73 65   0.  };..  memse
1420: 74 28 26 77 72 61 70 70 65 64 2c 20 30 2c 20 73  t(&wrapped, 0, s
1430: 69 7a 65 6f 66 28 77 72 61 70 70 65 64 29 29 3b  izeof(wrapped));
1440: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 68 75 74  ..  sqlite3_shut
1450: 64 6f 77 6e 28 29 3b 0a 20 20 73 71 6c 69 74 65  down();.  sqlite
1460: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
1470: 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54 45 58 2c  CONFIG_GETMUTEX,
1480: 20 26 77 72 61 70 70 65 64 2e 6d 75 74 65 78 29   &wrapped.mutex)
1490: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66  ;.  sqlite3_conf
14a0: 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
14b0: 5f 47 45 54 4d 41 4c 4c 4f 43 2c 20 26 77 72 61  _GETMALLOC, &wra
14c0: 70 70 65 64 2e 6d 65 6d 29 3b 0a 20 20 73 71 6c  pped.mem);.  sql
14d0: 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
14e0: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41  TE_CONFIG_GETPCA
14f0: 43 48 45 32 2c 20 26 77 72 61 70 70 65 64 2e 70  CHE2, &wrapped.p
1500: 63 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65  cache);.  sqlite
1510: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
1520: 43 4f 4e 46 49 47 5f 4d 55 54 45 58 2c 20 26 6d  CONFIG_MUTEX, &m
1530: 75 74 65 78 6d 65 74 68 6f 64 73 29 3b 0a 20 20  utexmethods);.  
1540: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
1550: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c  QLITE_CONFIG_MAL
1560: 4c 4f 43 2c 20 26 6d 65 6d 6d 65 74 68 6f 64 73  LOC, &memmethods
1570: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  );.  sqlite3_con
1580: 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
1590: 47 5f 50 43 41 43 48 45 32 2c 20 26 70 63 61 63  G_PCACHE2, &pcac
15a0: 68 65 6d 65 74 68 6f 64 73 29 3b 0a 7d 0a 0a 73  hemethods);.}..s
15b0: 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 5f 77  tatic int init_w
15c0: 72 61 70 70 65 72 5f 69 6e 73 74 61 6c 6c 28 0a  rapper_install(.
15d0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
15e0: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73  entData, /* Unus
15f0: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
1600: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
1610: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
1620: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
1630: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
1640: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
1650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1660: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
1670: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
1680: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
1690: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
16a0: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
16b0: 69 3b 0a 20 20 69 6e 73 74 61 6c 6c 49 6e 69 74  i;.  installInit
16c0: 57 72 61 70 70 65 72 73 28 29 3b 0a 20 20 66 6f  Wrappers();.  fo
16d0: 72 28 69 3d 31 3b 20 69 3c 6f 62 6a 63 3b 20 69  r(i=1; i<objc; i
16e0: 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
16f0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
1700: 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 69  (objv[i]);.    i
1710: 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 6d 65  f( strcmp(z, "me
1720: 6d 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  m")==0 ){.      
1730: 77 72 61 70 70 65 64 2e 6d 65 6d 5f 66 61 69 6c  wrapped.mem_fail
1740: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
1750: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 6d  if( strcmp(z, "m
1760: 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  utex")==0 ){.   
1770: 20 20 20 77 72 61 70 70 65 64 2e 6d 75 74 65 78     wrapped.mutex
1780: 5f 66 61 69 6c 20 3d 20 31 3b 0a 20 20 20 20 7d  _fail = 1;.    }
1790: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
17a0: 7a 2c 20 22 70 63 61 63 68 65 22 29 3d 3d 30 20  z, "pcache")==0 
17b0: 29 7b 0a 20 20 20 20 20 20 77 72 61 70 70 65 64  ){.      wrapped
17c0: 2e 70 63 61 63 68 65 5f 66 61 69 6c 20 3d 20 31  .pcache_fail = 1
17d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
17f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 55 6e 6b  ult(interp, "Unk
1800: 6e 6f 77 6e 20 61 72 67 75 6d 65 6e 74 3a 20 5c  nown argument: \
1810: 22 22 2c 20 7a 2c 20 22 5c 22 22 29 3b 0a 20 20  "", z, "\"");.  
1820: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1830: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
1840: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1850: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .}..static int i
1860: 6e 69 74 5f 77 72 61 70 70 65 72 5f 75 6e 69 6e  nit_wrapper_unin
1870: 73 74 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44  stall(.  ClientD
1880: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
1890: 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54  /* Unused */.  T
18a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
18b0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
18c0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
18d0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
18e0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
18f0: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
1900: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1910: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
1920: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1930: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
1940: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
1950: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29  .  if( objc!=1 )
1960: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1970: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1980: 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
1990: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19a0: 52 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74  R;.  }..  memset
19b0: 28 26 77 72 61 70 70 65 64 2c 20 30 2c 20 73 69  (&wrapped, 0, si
19c0: 7a 65 6f 66 28 26 77 72 61 70 70 65 64 29 29 3b  zeof(&wrapped));
19d0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  .  sqlite3_shutd
19e0: 6f 77 6e 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  own();.  sqlite3
19f0: 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
1a00: 4f 4e 46 49 47 5f 4d 55 54 45 58 2c 20 26 77 72  ONFIG_MUTEX, &wr
1a10: 61 70 70 65 64 2e 6d 75 74 65 78 29 3b 0a 20 20  apped.mutex);.  
1a20: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
1a30: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c  QLITE_CONFIG_MAL
1a40: 4c 4f 43 2c 20 26 77 72 61 70 70 65 64 2e 6d 65  LOC, &wrapped.me
1a50: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  m);.  sqlite3_co
1a60: 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
1a70: 49 47 5f 50 43 41 43 48 45 32 2c 20 26 77 72 61  IG_PCACHE2, &wra
1a80: 70 70 65 64 2e 70 63 61 63 68 65 29 3b 0a 20 20  pped.pcache);.  
1a90: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1aa0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69  ..static int ini
1ab0: 74 5f 77 72 61 70 70 65 72 5f 63 6c 65 61 72 28  t_wrapper_clear(
1ac0: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
1ad0: 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75  ientData, /* Unu
1ae0: 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
1af0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
1b00: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
1b10: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
1b20: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
1b30: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b50: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
1b60: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
1b70: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
1b80: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
1b90: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ents */.){.  if(
1ba0: 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20   objc!=1 ){.    
1bb0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1bc0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1bd0: 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72  , "");.    retur
1be0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1bf0: 0a 0a 20 20 77 72 61 70 70 65 64 2e 6d 65 6d 5f  ..  wrapped.mem_
1c00: 66 61 69 6c 20 3d 20 30 3b 0a 20 20 77 72 61 70  fail = 0;.  wrap
1c10: 70 65 64 2e 6d 75 74 65 78 5f 66 61 69 6c 20 3d  ped.mutex_fail =
1c20: 20 30 3b 0a 20 20 77 72 61 70 70 65 64 2e 70 63   0;.  wrapped.pc
1c30: 61 63 68 65 5f 66 61 69 6c 20 3d 20 30 3b 0a 20  ache_fail = 0;. 
1c40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1c50: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  }..static int in
1c60: 69 74 5f 77 72 61 70 70 65 72 5f 71 75 65 72 79  it_wrapper_query
1c70: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
1c80: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e  lientData, /* Un
1c90: 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
1ca0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
1cb0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
1cc0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
1cd0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
1ce0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d00: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
1d10: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
1d20: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
1d30: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
1d40: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63  ments */.){.  Tc
1d50: 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20  l_Obj *pRet;..  
1d60: 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20  if( objc!=1 ){. 
1d70: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1d80: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1d90: 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65  bjv, "");.    re
1da0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1db0: 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20 54 63    }..  pRet = Tc
1dc0: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 69 66  l_NewObj();.  if
1dd0: 28 20 77 72 61 70 70 65 64 2e 6d 75 74 65 78 5f  ( wrapped.mutex_
1de0: 69 6e 69 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f  init ){.    Tcl_
1df0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1e00: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
1e10: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
1e20: 4f 62 6a 28 22 6d 75 74 65 78 22 2c 20 2d 31 29  Obj("mutex", -1)
1e30: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 72 61  );.  }.  if( wra
1e40: 70 70 65 64 2e 6d 65 6d 5f 69 6e 69 74 20 29 7b  pped.mem_init ){
1e50: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1e60: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1e70: 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
1e80: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 65  NewStringObj("me
1e90: 6d 22 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20  m", -1));.  }.  
1ea0: 69 66 28 20 77 72 61 70 70 65 64 2e 70 63 61 63  if( wrapped.pcac
1eb0: 68 65 5f 69 6e 69 74 20 29 7b 0a 20 20 20 20 54  he_init ){.    T
1ec0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1ed0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1ee0: 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
1ef0: 69 6e 67 4f 62 6a 28 22 70 63 61 63 68 65 22 2c  ingObj("pcache",
1f00: 20 2d 31 29 29 3b 0a 20 20 7d 0a 0a 20 20 54 63   -1));.  }..  Tc
1f10: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1f20: 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20  nterp, pRet);.  
1f30: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1f40: 0a 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  ..int Sqlitetest
1f50: 5f 69 6e 69 74 5f 49 6e 69 74 28 54 63 6c 5f 49  _init_Init(Tcl_I
1f60: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
1f70: 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
1f80: 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  {.     char *zNa
1f90: 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a  me;.     Tcl_Obj
1fa0: 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a  CmdProc *xProc;.
1fb0: 20 20 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20    } aObjCmd[] = 
1fc0: 7b 0a 20 20 20 20 7b 22 69 6e 69 74 5f 77 72 61  {.    {"init_wra
1fd0: 70 70 65 72 5f 69 6e 73 74 61 6c 6c 22 2c 20 20  pper_install",  
1fe0: 20 69 6e 69 74 5f 77 72 61 70 70 65 72 5f 69 6e   init_wrapper_in
1ff0: 73 74 61 6c 6c 7d 2c 0a 20 20 20 20 7b 22 69 6e  stall},.    {"in
2000: 69 74 5f 77 72 61 70 70 65 72 5f 71 75 65 72 79  it_wrapper_query
2010: 22 2c 20 20 20 20 20 69 6e 69 74 5f 77 72 61 70  ",     init_wrap
2020: 70 65 72 5f 71 75 65 72 79 20 20 7d 2c 0a 20 20  per_query  },.  
2030: 20 20 7b 22 69 6e 69 74 5f 77 72 61 70 70 65 72    {"init_wrapper
2040: 5f 75 6e 69 6e 73 74 61 6c 6c 22 2c 20 69 6e 69  _uninstall", ini
2050: 74 5f 77 72 61 70 70 65 72 5f 75 6e 69 6e 73 74  t_wrapper_uninst
2060: 61 6c 6c 7d 2c 0a 20 20 20 20 7b 22 69 6e 69 74  all},.    {"init
2070: 5f 77 72 61 70 70 65 72 5f 63 6c 65 61 72 22 2c  _wrapper_clear",
2080: 20 20 20 20 20 69 6e 69 74 5f 77 72 61 70 70 65       init_wrappe
2090: 72 5f 63 6c 65 61 72 7d 0a 20 20 7d 3b 0a 20 20  r_clear}.  };.  
20a0: 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d  int i;..  for(i=
20b0: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a  0; i<sizeof(aObj
20c0: 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a  Cmd)/sizeof(aObj
20d0: 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Cmd[0]); i++){. 
20e0: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
20f0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
2100: 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65  aObjCmd[i].zName
2110: 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72  , aObjCmd[i].xPr
2120: 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  oc, 0, 0);.  }..
2130: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2140: 0a 7d 0a                                         .}.