/ Hex Artifact Content
Login

Artifact 5d624ffd0409d424cf9adbfe1f056b200270077c:


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 20 70 63 61 63 68 65 3b 0a 20 20 73 71 6c  ds pcache;.  sql
0480: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
0490: 20 20 20 20 6d 65 6d 3b 0a 20 20 73 71 6c 69 74      mem;.  sqlit
04a0: 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73  e3_mutex_methods
04b0: 20 20 6d 75 74 65 78 3b 0a 0a 20 20 69 6e 74 20    mutex;..  int 
04c0: 6d 65 6d 5f 69 6e 69 74 3b 20 20 20 20 20 20 20  mem_init;       
04d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
04e0: 20 69 66 20 6d 65 6d 20 73 75 62 73 79 73 74 65   if mem subsyste
04f0: 6d 20 69 73 20 69 6e 69 74 61 6c 69 7a 65 64 20  m is initalized 
0500: 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 5f 66 61 69  */.  int mem_fai
0510: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
0520: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 66 61 69    /* True to fai
0530: 6c 20 6d 65 6d 20 73 75 62 73 79 73 74 65 6d 20  l mem subsystem 
0540: 69 6e 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a  inialization */.
0550: 20 20 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74    int mutex_init
0560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
0570: 2a 20 54 72 75 65 20 69 66 20 6d 75 74 65 78 20  * True if mutex 
0580: 73 75 62 73 79 73 74 65 6d 20 69 73 20 69 6e 69  subsystem is ini
0590: 74 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74  talized */.  int
05a0: 20 6d 75 74 65 78 5f 66 61 69 6c 3b 20 20 20 20   mutex_fail;    
05b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
05c0: 65 20 74 6f 20 66 61 69 6c 20 6d 75 74 65 78 20  e to fail mutex 
05d0: 73 75 62 73 79 73 74 65 6d 20 69 6e 69 61 6c 69  subsystem iniali
05e0: 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  zation */.  int 
05f0: 70 63 61 63 68 65 5f 69 6e 69 74 3b 20 20 20 20  pcache_init;    
0600: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
0610: 20 69 66 20 70 63 61 63 68 65 20 73 75 62 73 79   if pcache subsy
0620: 73 74 65 6d 20 69 73 20 69 6e 69 74 61 6c 69 7a  stem is initaliz
0630: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63  ed */.  int pcac
0640: 68 65 5f 66 61 69 6c 3b 20 20 20 20 20 20 20 20  he_fail;        
0650: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
0660: 66 61 69 6c 20 70 63 61 63 68 65 20 73 75 62 73  fail pcache subs
0670: 79 73 74 65 6d 20 69 6e 69 61 6c 69 7a 61 74 69  ystem inializati
0680: 6f 6e 20 2a 2f 0a 7d 20 77 72 61 70 70 65 64 3b  on */.} wrapped;
0690: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 4d  ..static int wrM
06a0: 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70  emInit(void *pAp
06b0: 70 44 61 74 61 29 7b 0a 20 20 69 6e 74 20 72 63  pData){.  int rc
06c0: 3b 0a 20 20 69 66 28 20 77 72 61 70 70 65 64 2e  ;.  if( wrapped.
06d0: 6d 65 6d 5f 66 61 69 6c 20 29 7b 0a 20 20 20 20  mem_fail ){.    
06e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
06f0: 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
0700: 72 63 20 3d 20 77 72 61 70 70 65 64 2e 6d 65 6d  rc = wrapped.mem
0710: 2e 78 49 6e 69 74 28 77 72 61 70 70 65 64 2e 6d  .xInit(wrapped.m
0720: 65 6d 2e 70 41 70 70 44 61 74 61 29 3b 0a 20 20  em.pAppData);.  
0730: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
0740: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 77 72 61  TE_OK ){.    wra
0750: 70 70 65 64 2e 6d 65 6d 5f 69 6e 69 74 20 3d 20  pped.mem_init = 
0760: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
0770: 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  rc;.}.static voi
0780: 64 20 77 72 4d 65 6d 53 68 75 74 64 6f 77 6e 28  d wrMemShutdown(
0790: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b  void *pAppData){
07a0: 0a 20 20 77 72 61 70 70 65 64 2e 6d 65 6d 2e 78  .  wrapped.mem.x
07b0: 53 68 75 74 64 6f 77 6e 28 77 72 61 70 70 65 64  Shutdown(wrapped
07c0: 2e 6d 65 6d 2e 70 41 70 70 44 61 74 61 29 3b 0a  .mem.pAppData);.
07d0: 20 20 77 72 61 70 70 65 64 2e 6d 65 6d 5f 69 6e    wrapped.mem_in
07e0: 69 74 20 3d 20 30 3b 0a 7d 0a 73 74 61 74 69 63  it = 0;.}.static
07f0: 20 76 6f 69 64 20 2a 77 72 4d 65 6d 4d 61 6c 6c   void *wrMemMall
0800: 6f 63 28 69 6e 74 20 6e 29 20 20 20 20 20 20 20  oc(int n)       
0810: 20 20 20 20 7b 72 65 74 75 72 6e 20 77 72 61 70      {return wrap
0820: 70 65 64 2e 6d 65 6d 2e 78 4d 61 6c 6c 6f 63 28  ped.mem.xMalloc(
0830: 6e 29 3b 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  n);}.static void
0840: 20 77 72 4d 65 6d 46 72 65 65 28 76 6f 69 64 20   wrMemFree(void 
0850: 2a 70 29 20 20 20 20 20 20 20 20 20 20 20 20 7b  *p)            {
0860: 77 72 61 70 70 65 64 2e 6d 65 6d 2e 78 46 72 65  wrapped.mem.xFre
0870: 65 28 70 29 3b 7d 0a 73 74 61 74 69 63 20 76 6f  e(p);}.static vo
0880: 69 64 20 2a 77 72 4d 65 6d 52 65 61 6c 6c 6f 63  id *wrMemRealloc
0890: 28 76 6f 69 64 20 2a 70 2c 20 69 6e 74 20 6e 29  (void *p, int n)
08a0: 20 7b 72 65 74 75 72 6e 20 77 72 61 70 70 65 64   {return wrapped
08b0: 2e 6d 65 6d 2e 78 52 65 61 6c 6c 6f 63 28 70 2c  .mem.xRealloc(p,
08c0: 20 6e 29 3b 7d 0a 73 74 61 74 69 63 20 69 6e 74   n);}.static int
08d0: 20 77 72 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20   wrMemSize(void 
08e0: 2a 70 29 20 20 20 20 20 20 20 20 20 20 20 20 20  *p)             
08f0: 7b 72 65 74 75 72 6e 20 77 72 61 70 70 65 64 2e  {return wrapped.
0900: 6d 65 6d 2e 78 53 69 7a 65 28 70 29 3b 7d 0a 73  mem.xSize(p);}.s
0910: 74 61 74 69 63 20 69 6e 74 20 77 72 4d 65 6d 52  tatic int wrMemR
0920: 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 20 20 20  oundup(int n)   
0930: 20 20 20 20 20 20 20 20 20 7b 72 65 74 75 72 6e           {return
0940: 20 77 72 61 70 70 65 64 2e 6d 65 6d 2e 78 52 6f   wrapped.mem.xRo
0950: 75 6e 64 75 70 28 6e 29 3b 7d 0a 0a 0a 73 74 61  undup(n);}...sta
0960: 74 69 63 20 69 6e 74 20 77 72 4d 75 74 65 78 49  tic int wrMutexI
0970: 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74  nit(void){.  int
0980: 20 72 63 3b 0a 20 20 69 66 28 20 77 72 61 70 70   rc;.  if( wrapp
0990: 65 64 2e 6d 75 74 65 78 5f 66 61 69 6c 20 29 7b  ed.mutex_fail ){
09a0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
09b0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
09c0: 0a 20 20 20 20 72 63 20 3d 20 77 72 61 70 70 65  .    rc = wrappe
09d0: 64 2e 6d 75 74 65 78 2e 78 4d 75 74 65 78 49 6e  d.mutex.xMutexIn
09e0: 69 74 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  it();.  }.  if( 
09f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
0a00: 0a 20 20 20 20 77 72 61 70 70 65 64 2e 6d 75 74  .    wrapped.mut
0a10: 65 78 5f 69 6e 69 74 20 3d 20 31 3b 0a 20 20 7d  ex_init = 1;.  }
0a20: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
0a30: 73 74 61 74 69 63 20 69 6e 74 20 77 72 4d 75 74  static int wrMut
0a40: 65 78 45 6e 64 28 76 6f 69 64 29 7b 0a 20 20 77  exEnd(void){.  w
0a50: 72 61 70 70 65 64 2e 6d 75 74 65 78 2e 78 4d 75  rapped.mutex.xMu
0a60: 74 65 78 45 6e 64 28 29 3b 0a 20 20 77 72 61 70  texEnd();.  wrap
0a70: 70 65 64 2e 6d 75 74 65 78 5f 69 6e 69 74 20 3d  ped.mutex_init =
0a80: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
0a90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
0aa0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
0ab0: 77 72 4d 75 74 65 78 41 6c 6c 6f 63 28 69 6e 74  wrMutexAlloc(int
0ac0: 20 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 77 72   e){.  return wr
0ad0: 61 70 70 65 64 2e 6d 75 74 65 78 2e 78 4d 75 74  apped.mutex.xMut
0ae0: 65 78 41 6c 6c 6f 63 28 65 29 3b 0a 7d 0a 73 74  exAlloc(e);.}.st
0af0: 61 74 69 63 20 76 6f 69 64 20 77 72 4d 75 74 65  atic void wrMute
0b00: 78 46 72 65 65 28 73 71 6c 69 74 65 33 5f 6d 75  xFree(sqlite3_mu
0b10: 74 65 78 20 2a 70 29 7b 0a 20 20 77 72 61 70 70  tex *p){.  wrapp
0b20: 65 64 2e 6d 75 74 65 78 2e 78 4d 75 74 65 78 46  ed.mutex.xMutexF
0b30: 72 65 65 28 70 29 3b 0a 7d 0a 73 74 61 74 69 63  ree(p);.}.static
0b40: 20 76 6f 69 64 20 77 72 4d 75 74 65 78 45 6e 74   void wrMutexEnt
0b50: 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  er(sqlite3_mutex
0b60: 20 2a 70 29 7b 0a 20 20 77 72 61 70 70 65 64 2e   *p){.  wrapped.
0b70: 6d 75 74 65 78 2e 78 4d 75 74 65 78 45 6e 74 65  mutex.xMutexEnte
0b80: 72 28 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  r(p);.}.static i
0b90: 6e 74 20 77 72 4d 75 74 65 78 54 72 79 28 73 71  nt wrMutexTry(sq
0ba0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b  lite3_mutex *p){
0bb0: 0a 20 20 72 65 74 75 72 6e 20 77 72 61 70 70 65  .  return wrappe
0bc0: 64 2e 6d 75 74 65 78 2e 78 4d 75 74 65 78 54 72  d.mutex.xMutexTr
0bd0: 79 28 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  y(p);.}.static v
0be0: 6f 69 64 20 77 72 4d 75 74 65 78 4c 65 61 76 65  oid wrMutexLeave
0bf0: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a  (sqlite3_mutex *
0c00: 70 29 7b 0a 20 20 77 72 61 70 70 65 64 2e 6d 75  p){.  wrapped.mu
0c10: 74 65 78 2e 78 4d 75 74 65 78 4c 65 61 76 65 28  tex.xMutexLeave(
0c20: 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  p);.}.static int
0c30: 20 77 72 4d 75 74 65 78 48 65 6c 64 28 73 71 6c   wrMutexHeld(sql
0c40: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a  ite3_mutex *p){.
0c50: 20 20 72 65 74 75 72 6e 20 77 72 61 70 70 65 64    return wrapped
0c60: 2e 6d 75 74 65 78 2e 78 4d 75 74 65 78 48 65 6c  .mutex.xMutexHel
0c70: 64 28 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  d(p);.}.static i
0c80: 6e 74 20 77 72 4d 75 74 65 78 4e 6f 74 68 65 6c  nt wrMutexNothel
0c90: 64 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  d(sqlite3_mutex 
0ca0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 77 72  *p){.  return wr
0cb0: 61 70 70 65 64 2e 6d 75 74 65 78 2e 78 4d 75 74  apped.mutex.xMut
0cc0: 65 78 4e 6f 74 68 65 6c 64 28 70 29 3b 0a 7d 0a  exNotheld(p);.}.
0cd0: 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  ...static int wr
0ce0: 50 43 61 63 68 65 49 6e 69 74 28 76 6f 69 64 20  PCacheInit(void 
0cf0: 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63  *pArg){.  int rc
0d00: 3b 0a 20 20 69 66 28 20 77 72 61 70 70 65 64 2e  ;.  if( wrapped.
0d10: 70 63 61 63 68 65 5f 66 61 69 6c 20 29 7b 0a 20  pcache_fail ){. 
0d20: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
0d30: 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
0d40: 20 20 20 72 63 20 3d 20 77 72 61 70 70 65 64 2e     rc = wrapped.
0d50: 70 63 61 63 68 65 2e 78 49 6e 69 74 28 77 72 61  pcache.xInit(wra
0d60: 70 70 65 64 2e 70 63 61 63 68 65 2e 70 41 72 67  pped.pcache.pArg
0d70: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
0d80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
0d90: 20 20 77 72 61 70 70 65 64 2e 70 63 61 63 68 65    wrapped.pcache
0da0: 5f 69 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  _init = 1;.  }. 
0db0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
0dc0: 61 74 69 63 20 76 6f 69 64 20 77 72 50 43 61 63  atic void wrPCac
0dd0: 68 65 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20  heShutdown(void 
0de0: 2a 70 41 72 67 29 7b 0a 20 20 77 72 61 70 70 65  *pArg){.  wrappe
0df0: 64 2e 70 63 61 63 68 65 2e 78 53 68 75 74 64 6f  d.pcache.xShutdo
0e00: 77 6e 28 77 72 61 70 70 65 64 2e 70 63 61 63 68  wn(wrapped.pcach
0e10: 65 2e 70 41 72 67 29 3b 0a 20 20 77 72 61 70 70  e.pArg);.  wrapp
0e20: 65 64 2e 70 63 61 63 68 65 5f 69 6e 69 74 20 3d  ed.pcache_init =
0e30: 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 71   0;.}..static sq
0e40: 6c 69 74 65 33 5f 70 63 61 63 68 65 20 2a 77 72  lite3_pcache *wr
0e50: 50 43 61 63 68 65 43 72 65 61 74 65 28 69 6e 74  PCacheCreate(int
0e60: 20 61 2c 20 69 6e 74 20 62 29 7b 0a 20 20 72 65   a, int b){.  re
0e70: 74 75 72 6e 20 77 72 61 70 70 65 64 2e 70 63 61  turn wrapped.pca
0e80: 63 68 65 2e 78 43 72 65 61 74 65 28 61 2c 20 62  che.xCreate(a, b
0e90: 29 3b 0a 7d 20 20 0a 73 74 61 74 69 63 20 76 6f  );.}  .static vo
0ea0: 69 64 20 77 72 50 43 61 63 68 65 43 61 63 68 65  id wrPCacheCache
0eb0: 73 69 7a 65 28 73 71 6c 69 74 65 33 5f 70 63 61  size(sqlite3_pca
0ec0: 63 68 65 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a  che *p, int n){.
0ed0: 20 20 77 72 61 70 70 65 64 2e 70 63 61 63 68 65    wrapped.pcache
0ee0: 2e 78 43 61 63 68 65 73 69 7a 65 28 70 2c 20 6e  .xCachesize(p, n
0ef0: 29 3b 0a 7d 20 20 0a 73 74 61 74 69 63 20 69 6e  );.}  .static in
0f00: 74 20 77 72 50 43 61 63 68 65 50 61 67 65 63 6f  t wrPCachePageco
0f10: 75 6e 74 28 73 71 6c 69 74 65 33 5f 70 63 61 63  unt(sqlite3_pcac
0f20: 68 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  he *p){.  return
0f30: 20 77 72 61 70 70 65 64 2e 70 63 61 63 68 65 2e   wrapped.pcache.
0f40: 78 50 61 67 65 63 6f 75 6e 74 28 70 29 3b 0a 7d  xPagecount(p);.}
0f50: 20 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a    .static void *
0f60: 77 72 50 43 61 63 68 65 46 65 74 63 68 28 73 71  wrPCacheFetch(sq
0f70: 6c 69 74 65 33 5f 70 63 61 63 68 65 20 2a 70 2c  lite3_pcache *p,
0f80: 20 75 6e 73 69 67 6e 65 64 20 61 2c 20 69 6e 74   unsigned a, int
0f90: 20 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 77 72   b){.  return wr
0fa0: 61 70 70 65 64 2e 70 63 61 63 68 65 2e 78 46 65  apped.pcache.xFe
0fb0: 74 63 68 28 70 2c 20 61 2c 20 62 29 3b 0a 7d 20  tch(p, a, b);.} 
0fc0: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 72   .static void wr
0fd0: 50 43 61 63 68 65 55 6e 70 69 6e 28 73 71 6c 69  PCacheUnpin(sqli
0fe0: 74 65 33 5f 70 63 61 63 68 65 20 2a 70 2c 20 76  te3_pcache *p, v
0ff0: 6f 69 64 20 2a 61 2c 20 69 6e 74 20 62 29 7b 0a  oid *a, int b){.
1000: 20 20 77 72 61 70 70 65 64 2e 70 63 61 63 68 65    wrapped.pcache
1010: 2e 78 55 6e 70 69 6e 28 70 2c 20 61 2c 20 62 29  .xUnpin(p, a, b)
1020: 3b 0a 7d 20 20 0a 73 74 61 74 69 63 20 76 6f 69  ;.}  .static voi
1030: 64 20 77 72 50 43 61 63 68 65 52 65 6b 65 79 28  d wrPCacheRekey(
1040: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 20 2a  sqlite3_pcache *
1050: 70 2c 20 76 6f 69 64 20 2a 61 2c 20 75 6e 73 69  p, void *a, unsi
1060: 67 6e 65 64 20 62 2c 20 75 6e 73 69 67 6e 65 64  gned b, unsigned
1070: 20 63 29 7b 0a 20 20 77 72 61 70 70 65 64 2e 70   c){.  wrapped.p
1080: 63 61 63 68 65 2e 78 52 65 6b 65 79 28 70 2c 20  cache.xRekey(p, 
1090: 61 2c 20 62 2c 20 63 29 3b 0a 7d 20 20 0a 73 74  a, b, c);.}  .st
10a0: 61 74 69 63 20 76 6f 69 64 20 77 72 50 43 61 63  atic void wrPCac
10b0: 68 65 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74  heTruncate(sqlit
10c0: 65 33 5f 70 63 61 63 68 65 20 2a 70 2c 20 75 6e  e3_pcache *p, un
10d0: 73 69 67 6e 65 64 20 61 29 7b 0a 20 20 77 72 61  signed a){.  wra
10e0: 70 70 65 64 2e 70 63 61 63 68 65 2e 78 54 72 75  pped.pcache.xTru
10f0: 6e 63 61 74 65 28 70 2c 20 61 29 3b 0a 7d 20 20  ncate(p, a);.}  
1100: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 72 50  .static void wrP
1110: 43 61 63 68 65 44 65 73 74 72 6f 79 28 73 71 6c  CacheDestroy(sql
1120: 69 74 65 33 5f 70 63 61 63 68 65 20 2a 70 29 7b  ite3_pcache *p){
1130: 0a 20 20 77 72 61 70 70 65 64 2e 70 63 61 63 68  .  wrapped.pcach
1140: 65 2e 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 7d  e.xDestroy(p);.}
1150: 20 20 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20    ..static void 
1160: 69 6e 73 74 61 6c 6c 49 6e 69 74 57 72 61 70 70  installInitWrapp
1170: 65 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ers(void){.  sql
1180: 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f  ite3_mutex_metho
1190: 64 73 20 6d 75 74 65 78 6d 65 74 68 6f 64 73 20  ds mutexmethods 
11a0: 3d 20 7b 0a 20 20 20 20 77 72 4d 75 74 65 78 49  = {.    wrMutexI
11b0: 6e 69 74 2c 20 20 77 72 4d 75 74 65 78 45 6e 64  nit,  wrMutexEnd
11c0: 2c 20 20 20 77 72 4d 75 74 65 78 41 6c 6c 6f 63  ,   wrMutexAlloc
11d0: 2c 0a 20 20 20 20 77 72 4d 75 74 65 78 46 72 65  ,.    wrMutexFre
11e0: 65 2c 20 20 77 72 4d 75 74 65 78 45 6e 74 65 72  e,  wrMutexEnter
11f0: 2c 20 77 72 4d 75 74 65 78 54 72 79 2c 0a 20 20  , wrMutexTry,.  
1200: 20 20 77 72 4d 75 74 65 78 4c 65 61 76 65 2c 20    wrMutexLeave, 
1210: 77 72 4d 75 74 65 78 48 65 6c 64 2c 20 20 77 72  wrMutexHeld,  wr
1220: 4d 75 74 65 78 4e 6f 74 68 65 6c 64 0a 20 20 7d  MutexNotheld.  }
1230: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63  ;.  sqlite3_pcac
1240: 68 65 5f 6d 65 74 68 6f 64 73 20 70 63 61 63 68  he_methods pcach
1250: 65 6d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20  emethods = {.   
1260: 20 30 2c 0a 20 20 20 20 77 72 50 43 61 63 68 65   0,.    wrPCache
1270: 49 6e 69 74 2c 20 20 20 20 20 20 77 72 50 43 61  Init,      wrPCa
1280: 63 68 65 53 68 75 74 64 6f 77 6e 2c 20 20 77 72  cheShutdown,  wr
1290: 50 43 61 63 68 65 43 72 65 61 74 65 2c 20 0a 20  PCacheCreate, . 
12a0: 20 20 20 77 72 50 43 61 63 68 65 43 61 63 68 65     wrPCacheCache
12b0: 73 69 7a 65 2c 20 77 72 50 43 61 63 68 65 50 61  size, wrPCachePa
12c0: 67 65 63 6f 75 6e 74 2c 20 77 72 50 43 61 63 68  gecount, wrPCach
12d0: 65 46 65 74 63 68 2c 0a 20 20 20 20 77 72 50 43  eFetch,.    wrPC
12e0: 61 63 68 65 55 6e 70 69 6e 2c 20 20 20 20 20 77  acheUnpin,     w
12f0: 72 50 43 61 63 68 65 52 65 6b 65 79 2c 20 20 20  rPCacheRekey,   
1300: 20 20 77 72 50 43 61 63 68 65 54 72 75 6e 63 61    wrPCacheTrunca
1310: 74 65 2c 20 20 0a 20 20 20 20 77 72 50 43 61 63  te,  .    wrPCac
1320: 68 65 44 65 73 74 72 6f 79 0a 20 20 7d 3b 0a 20  heDestroy.  };. 
1330: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
1340: 68 6f 64 73 20 6d 65 6d 6d 65 74 68 6f 64 73 20  hods memmethods 
1350: 3d 20 7b 0a 20 20 20 20 77 72 4d 65 6d 4d 61 6c  = {.    wrMemMal
1360: 6c 6f 63 2c 20 20 20 77 72 4d 65 6d 46 72 65 65  loc,   wrMemFree
1370: 2c 20 20 20 20 77 72 4d 65 6d 52 65 61 6c 6c 6f  ,    wrMemReallo
1380: 63 2c 0a 20 20 20 20 77 72 4d 65 6d 53 69 7a 65  c,.    wrMemSize
1390: 2c 20 20 20 20 20 77 72 4d 65 6d 52 6f 75 6e 64  ,     wrMemRound
13a0: 75 70 2c 20 77 72 4d 65 6d 49 6e 69 74 2c 0a 20  up, wrMemInit,. 
13b0: 20 20 20 77 72 4d 65 6d 53 68 75 74 64 6f 77 6e     wrMemShutdown
13c0: 2c 0a 20 20 20 20 30 0a 20 20 7d 3b 0a 0a 20 20  ,.    0.  };..  
13d0: 6d 65 6d 73 65 74 28 26 77 72 61 70 70 65 64 2c  memset(&wrapped,
13e0: 20 30 2c 20 73 69 7a 65 6f 66 28 77 72 61 70 70   0, sizeof(wrapp
13f0: 65 64 29 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  ed));..  sqlite3
1400: 5f 73 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 73  _shutdown();.  s
1410: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
1420: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d  LITE_CONFIG_GETM
1430: 55 54 45 58 2c 20 26 77 72 61 70 70 65 64 2e 6d  UTEX, &wrapped.m
1440: 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  utex);.  sqlite3
1450: 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
1460: 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 2c  ONFIG_GETMALLOC,
1470: 20 26 77 72 61 70 70 65 64 2e 6d 65 6d 29 3b 0a   &wrapped.mem);.
1480: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67    sqlite3_config
1490: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47  (SQLITE_CONFIG_G
14a0: 45 54 50 43 41 43 48 45 2c 20 26 77 72 61 70 70  ETPCACHE, &wrapp
14b0: 65 64 2e 70 63 61 63 68 65 29 3b 0a 20 20 73 71  ed.pcache);.  sq
14c0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
14d0: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58  ITE_CONFIG_MUTEX
14e0: 2c 20 26 6d 75 74 65 78 6d 65 74 68 6f 64 73 29  , &mutexmethods)
14f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66  ;.  sqlite3_conf
1500: 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
1510: 5f 4d 41 4c 4c 4f 43 2c 20 26 6d 65 6d 6d 65 74  _MALLOC, &memmet
1520: 68 6f 64 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  hods);.  sqlite3
1530: 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
1540: 4f 4e 46 49 47 5f 50 43 41 43 48 45 2c 20 26 70  ONFIG_PCACHE, &p
1550: 63 61 63 68 65 6d 65 74 68 6f 64 73 29 3b 0a 7d  cachemethods);.}
1560: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69  ..static int ini
1570: 74 5f 77 72 61 70 70 65 72 5f 69 6e 73 74 61 6c  t_wrapper_instal
1580: 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  l(.  ClientData 
1590: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55  clientData, /* U
15a0: 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  nused */.  Tcl_I
15b0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
15c0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
15d0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
15e0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
15f0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
1600: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1610: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
1620: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
1630: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1640: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
1650: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
1660: 6e 74 20 69 3b 0a 20 20 69 6e 73 74 61 6c 6c 49  nt i;.  installI
1670: 6e 69 74 57 72 61 70 70 65 72 73 28 29 3b 0a 20  nitWrappers();. 
1680: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6f 62 6a 63   for(i=1; i<objc
1690: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
16a0: 20 2a 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72   *z = Tcl_GetStr
16b0: 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20  ing(objv[i]);.  
16c0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20    if( strcmp(z, 
16d0: 22 6d 65 6d 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "mem")==0 ){.   
16e0: 20 20 20 77 72 61 70 70 65 64 2e 6d 65 6d 5f 66     wrapped.mem_f
16f0: 61 69 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  ail = 1;.    }el
1700: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
1710: 20 22 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a   "mutex")==0 ){.
1720: 20 20 20 20 20 20 77 72 61 70 70 65 64 2e 6d 75        wrapped.mu
1730: 74 65 78 5f 66 61 69 6c 20 3d 20 31 3b 0a 20 20  tex_fail = 1;.  
1740: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1750: 6d 70 28 7a 2c 20 22 70 63 61 63 68 65 22 29 3d  mp(z, "pcache")=
1760: 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 72 61 70  =0 ){.      wrap
1770: 70 65 64 2e 70 63 61 63 68 65 5f 66 61 69 6c 20  ped.pcache_fail 
1780: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
1790: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
17a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
17b0: 55 6e 6b 6e 6f 77 6e 20 61 72 67 75 6d 65 6e 74  Unknown argument
17c0: 3a 20 5c 22 22 2c 20 7a 2c 20 22 5c 22 22 29 3b  : \"", z, "\"");
17d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
17e0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
17f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1800: 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
1810: 74 20 69 6e 69 74 5f 77 72 61 70 70 65 72 5f 75  t init_wrapper_u
1820: 6e 69 6e 73 74 61 6c 6c 28 0a 20 20 43 6c 69 65  ninstall(.  Clie
1830: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
1840: 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a  a, /* Unused */.
1850: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1860: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
1870: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1880: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
1890: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
18a0: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
18b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18c0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
18d0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
18e0: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
18f0: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
1900: 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .){.  if( objc!=
1910: 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  1 ){.    Tcl_Wro
1920: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1930: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 1, objv, "");.
1940: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1950: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d  RROR;.  }..  mem
1960: 73 65 74 28 26 77 72 61 70 70 65 64 2c 20 30 2c  set(&wrapped, 0,
1970: 20 73 69 7a 65 6f 66 28 26 77 72 61 70 70 65 64   sizeof(&wrapped
1980: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 68  ));.  sqlite3_sh
1990: 75 74 64 6f 77 6e 28 29 3b 0a 20 20 73 71 6c 69  utdown();.  sqli
19a0: 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
19b0: 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 2c 20  E_CONFIG_MUTEX, 
19c0: 26 77 72 61 70 70 65 64 2e 6d 75 74 65 78 29 3b  &wrapped.mutex);
19d0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  .  sqlite3_confi
19e0: 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
19f0: 4d 41 4c 4c 4f 43 2c 20 26 77 72 61 70 70 65 64  MALLOC, &wrapped
1a00: 2e 6d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  .mem);.  sqlite3
1a10: 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
1a20: 4f 4e 46 49 47 5f 50 43 41 43 48 45 2c 20 26 77  ONFIG_PCACHE, &w
1a30: 72 61 70 70 65 64 2e 70 63 61 63 68 65 29 3b 0a  rapped.pcache);.
1a40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1a50: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .}..static int i
1a60: 6e 69 74 5f 77 72 61 70 70 65 72 5f 63 6c 65 61  nit_wrapper_clea
1a70: 72 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  r(.  ClientData 
1a80: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55  clientData, /* U
1a90: 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  nused */.  Tcl_I
1aa0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
1ab0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
1ac0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
1ad0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
1ae0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
1af0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1b00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
1b10: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
1b20: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1b30: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
1b40: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
1b50: 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20  f( objc!=1 ){.  
1b60: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1b70: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1b80: 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74  jv, "");.    ret
1b90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ba0: 20 7d 0a 0a 20 20 77 72 61 70 70 65 64 2e 6d 65   }..  wrapped.me
1bb0: 6d 5f 66 61 69 6c 20 3d 20 30 3b 0a 20 20 77 72  m_fail = 0;.  wr
1bc0: 61 70 70 65 64 2e 6d 75 74 65 78 5f 66 61 69 6c  apped.mutex_fail
1bd0: 20 3d 20 30 3b 0a 20 20 77 72 61 70 70 65 64 2e   = 0;.  wrapped.
1be0: 70 63 61 63 68 65 5f 66 61 69 6c 20 3d 20 30 3b  pcache_fail = 0;
1bf0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1c00: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1c10: 69 6e 69 74 5f 77 72 61 70 70 65 72 5f 71 75 65  init_wrapper_que
1c20: 72 79 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ry(.  ClientData
1c30: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
1c40: 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
1c50: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1c60: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
1c70: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
1c80: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
1c90: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
1ca0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1cb0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
1cc0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
1cd0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1ce0: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
1cf0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
1d00: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a  Tcl_Obj *pRet;..
1d10: 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b    if( objc!=1 ){
1d20: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1d30: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1d40: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
1d50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d60: 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20  ;.  }..  pRet = 
1d70: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
1d80: 69 66 28 20 77 72 61 70 70 65 64 2e 6d 75 74 65  if( wrapped.mute
1d90: 78 5f 69 6e 69 74 20 29 7b 0a 20 20 20 20 54 63  x_init ){.    Tc
1da0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1db0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
1dc0: 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
1dd0: 6e 67 4f 62 6a 28 22 6d 75 74 65 78 22 2c 20 2d  ngObj("mutex", -
1de0: 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77  1));.  }.  if( w
1df0: 72 61 70 70 65 64 2e 6d 65 6d 5f 69 6e 69 74 20  rapped.mem_init 
1e00: 29 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ){.    Tcl_ListO
1e10: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1e20: 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
1e30: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
1e40: 6d 65 6d 22 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a  mem", -1));.  }.
1e50: 20 20 69 66 28 20 77 72 61 70 70 65 64 2e 70 63    if( wrapped.pc
1e60: 61 63 68 65 5f 69 6e 69 74 20 29 7b 0a 20 20 20  ache_init ){.   
1e70: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1e80: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1e90: 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
1ea0: 74 72 69 6e 67 4f 62 6a 28 22 70 63 61 63 68 65  tringObj("pcache
1eb0: 22 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 0a 20 20  ", -1));.  }..  
1ec0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1ed0: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
1ee0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1ef0: 0a 7d 0a 0a 69 6e 74 20 53 71 6c 69 74 65 74 65  .}..int Sqlitete
1f00: 73 74 5f 69 6e 69 74 5f 49 6e 69 74 28 54 63 6c  st_init_Init(Tcl
1f10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
1f20: 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  {.  static struc
1f30: 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  t {.     char *z
1f40: 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f  Name;.     Tcl_O
1f50: 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63  bjCmdProc *xProc
1f60: 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20  ;.  } aObjCmd[] 
1f70: 3d 20 7b 0a 20 20 20 20 7b 22 69 6e 69 74 5f 77  = {.    {"init_w
1f80: 72 61 70 70 65 72 5f 69 6e 73 74 61 6c 6c 22 2c  rapper_install",
1f90: 20 20 20 69 6e 69 74 5f 77 72 61 70 70 65 72 5f     init_wrapper_
1fa0: 69 6e 73 74 61 6c 6c 7d 2c 0a 20 20 20 20 7b 22  install},.    {"
1fb0: 69 6e 69 74 5f 77 72 61 70 70 65 72 5f 71 75 65  init_wrapper_que
1fc0: 72 79 22 2c 20 20 20 20 20 69 6e 69 74 5f 77 72  ry",     init_wr
1fd0: 61 70 70 65 72 5f 71 75 65 72 79 20 20 7d 2c 0a  apper_query  },.
1fe0: 20 20 20 20 7b 22 69 6e 69 74 5f 77 72 61 70 70      {"init_wrapp
1ff0: 65 72 5f 75 6e 69 6e 73 74 61 6c 6c 22 2c 20 69  er_uninstall", i
2000: 6e 69 74 5f 77 72 61 70 70 65 72 5f 75 6e 69 6e  nit_wrapper_unin
2010: 73 74 61 6c 6c 7d 2c 0a 20 20 20 20 7b 22 69 6e  stall},.    {"in
2020: 69 74 5f 77 72 61 70 70 65 72 5f 63 6c 65 61 72  it_wrapper_clear
2030: 22 2c 20 20 20 20 20 69 6e 69 74 5f 77 72 61 70  ",     init_wrap
2040: 70 65 72 5f 63 6c 65 61 72 7d 0a 20 20 7d 3b 0a  per_clear}.  };.
2050: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28    int i;..  for(
2060: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f  i=0; i<sizeof(aO
2070: 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f  bjCmd)/sizeof(aO
2080: 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b  bjCmd[0]); i++){
2090: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
20a0: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
20b0: 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61  , aObjCmd[i].zNa
20c0: 6d 65 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78  me, aObjCmd[i].x
20d0: 50 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Proc, 0, 0);.  }
20e0: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
20f0: 4b 3b 0a 7d 0a                                   K;.}.