/ Hex Artifact Content
Login

Artifact 4413c211a94b62157ca4c145b3f27c497f03c664:


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 66 20 64 65 66 69 6e 65 64 28 49 4e 43 4c  #if defined(INCL
0440: 55 44 45 5f 53 51 4c 49 54 45 5f 54 43 4c 5f 48  UDE_SQLITE_TCL_H
0450: 29 0a 23 20 20 69 6e 63 6c 75 64 65 20 22 73 71  ).#  include "sq
0460: 6c 69 74 65 5f 74 63 6c 2e 68 22 0a 23 65 6c 73  lite_tcl.h".#els
0470: 65 0a 23 20 20 69 6e 63 6c 75 64 65 20 22 74 63  e.#  include "tc
0480: 6c 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 73 74 61  l.h".#endif..sta
0490: 74 69 63 20 73 74 72 75 63 74 20 57 72 61 70 70  tic struct Wrapp
04a0: 65 64 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70  ed {.  sqlite3_p
04b0: 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 20 70  cache_methods2 p
04c0: 63 61 63 68 65 3b 0a 20 20 73 71 6c 69 74 65 33  cache;.  sqlite3
04d0: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 20 20 20  _mem_methods    
04e0: 20 6d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f   mem;.  sqlite3_
04f0: 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 20 20 20  mutex_methods   
0500: 6d 75 74 65 78 3b 0a 0a 20 20 69 6e 74 20 6d 65  mutex;..  int me
0510: 6d 5f 69 6e 69 74 3b 20 20 20 20 20 20 20 20 20  m_init;         
0520: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
0530: 66 20 6d 65 6d 20 73 75 62 73 79 73 74 65 6d 20  f mem subsystem 
0540: 69 73 20 69 6e 69 74 61 6c 69 7a 65 64 20 2a 2f  is initalized */
0550: 0a 20 20 69 6e 74 20 6d 65 6d 5f 66 61 69 6c 3b  .  int mem_fail;
0560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0570: 2f 2a 20 54 72 75 65 20 74 6f 20 66 61 69 6c 20  /* True to fail 
0580: 6d 65 6d 20 73 75 62 73 79 73 74 65 6d 20 69 6e  mem subsystem in
0590: 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  ialization */.  
05a0: 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 3b 20  int mutex_init; 
05b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
05c0: 54 72 75 65 20 69 66 20 6d 75 74 65 78 20 73 75  True if mutex su
05d0: 62 73 79 73 74 65 6d 20 69 73 20 69 6e 69 74 61  bsystem is inita
05e0: 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6d  lized */.  int m
05f0: 75 74 65 78 5f 66 61 69 6c 3b 20 20 20 20 20 20  utex_fail;      
0600: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
0610: 74 6f 20 66 61 69 6c 20 6d 75 74 65 78 20 73 75  to fail mutex su
0620: 62 73 79 73 74 65 6d 20 69 6e 69 61 6c 69 7a 61  bsystem inializa
0630: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 70 63  tion */.  int pc
0640: 61 63 68 65 5f 69 6e 69 74 3b 20 20 20 20 20 20  ache_init;      
0650: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
0660: 66 20 70 63 61 63 68 65 20 73 75 62 73 79 73 74  f pcache subsyst
0670: 65 6d 20 69 73 20 69 6e 69 74 61 6c 69 7a 65 64  em is initalized
0680: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65   */.  int pcache
0690: 5f 66 61 69 6c 3b 20 20 20 20 20 20 20 20 20 20  _fail;          
06a0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 66 61     /* True to fa
06b0: 69 6c 20 70 63 61 63 68 65 20 73 75 62 73 79 73  il pcache subsys
06c0: 74 65 6d 20 69 6e 69 61 6c 69 7a 61 74 69 6f 6e  tem inialization
06d0: 20 2a 2f 0a 7d 20 77 72 61 70 70 65 64 3b 0a 0a   */.} wrapped;..
06e0: 73 74 61 74 69 63 20 69 6e 74 20 77 72 4d 65 6d  static int wrMem
06f0: 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44  Init(void *pAppD
0700: 61 74 61 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ata){.  int rc;.
0710: 20 20 69 66 28 20 77 72 61 70 70 65 64 2e 6d 65    if( wrapped.me
0720: 6d 5f 66 61 69 6c 20 29 7b 0a 20 20 20 20 72 63  m_fail ){.    rc
0730: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
0740: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
0750: 20 3d 20 77 72 61 70 70 65 64 2e 6d 65 6d 2e 78   = wrapped.mem.x
0760: 49 6e 69 74 28 77 72 61 70 70 65 64 2e 6d 65 6d  Init(wrapped.mem
0770: 2e 70 41 70 70 44 61 74 61 29 3b 0a 20 20 7d 0a  .pAppData);.  }.
0780: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
0790: 5f 4f 4b 20 29 7b 0a 20 20 20 20 77 72 61 70 70  _OK ){.    wrapp
07a0: 65 64 2e 6d 65 6d 5f 69 6e 69 74 20 3d 20 31 3b  ed.mem_init = 1;
07b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
07c0: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
07d0: 77 72 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f  wrMemShutdown(vo
07e0: 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20  id *pAppData){. 
07f0: 20 77 72 61 70 70 65 64 2e 6d 65 6d 2e 78 53 68   wrapped.mem.xSh
0800: 75 74 64 6f 77 6e 28 77 72 61 70 70 65 64 2e 6d  utdown(wrapped.m
0810: 65 6d 2e 70 41 70 70 44 61 74 61 29 3b 0a 20 20  em.pAppData);.  
0820: 77 72 61 70 70 65 64 2e 6d 65 6d 5f 69 6e 69 74  wrapped.mem_init
0830: 20 3d 20 30 3b 0a 7d 0a 73 74 61 74 69 63 20 76   = 0;.}.static v
0840: 6f 69 64 20 2a 77 72 4d 65 6d 4d 61 6c 6c 6f 63  oid *wrMemMalloc
0850: 28 69 6e 74 20 6e 29 20 20 20 20 20 20 20 20 20  (int n)         
0860: 20 20 7b 72 65 74 75 72 6e 20 77 72 61 70 70 65    {return wrappe
0870: 64 2e 6d 65 6d 2e 78 4d 61 6c 6c 6f 63 28 6e 29  d.mem.xMalloc(n)
0880: 3b 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  ;}.static void w
0890: 72 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70  rMemFree(void *p
08a0: 29 20 20 20 20 20 20 20 20 20 20 20 20 7b 77 72  )            {wr
08b0: 61 70 70 65 64 2e 6d 65 6d 2e 78 46 72 65 65 28  apped.mem.xFree(
08c0: 70 29 3b 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  p);}.static void
08d0: 20 2a 77 72 4d 65 6d 52 65 61 6c 6c 6f 63 28 76   *wrMemRealloc(v
08e0: 6f 69 64 20 2a 70 2c 20 69 6e 74 20 6e 29 20 7b  oid *p, int n) {
08f0: 72 65 74 75 72 6e 20 77 72 61 70 70 65 64 2e 6d  return wrapped.m
0900: 65 6d 2e 78 52 65 61 6c 6c 6f 63 28 70 2c 20 6e  em.xRealloc(p, n
0910: 29 3b 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 77  );}.static int w
0920: 72 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70  rMemSize(void *p
0930: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 72  )             {r
0940: 65 74 75 72 6e 20 77 72 61 70 70 65 64 2e 6d 65  eturn wrapped.me
0950: 6d 2e 78 53 69 7a 65 28 70 29 3b 7d 0a 73 74 61  m.xSize(p);}.sta
0960: 74 69 63 20 69 6e 74 20 77 72 4d 65 6d 52 6f 75  tic int wrMemRou
0970: 6e 64 75 70 28 69 6e 74 20 6e 29 20 20 20 20 20  ndup(int n)     
0980: 20 20 20 20 20 20 20 7b 72 65 74 75 72 6e 20 77         {return w
0990: 72 61 70 70 65 64 2e 6d 65 6d 2e 78 52 6f 75 6e  rapped.mem.xRoun
09a0: 64 75 70 28 6e 29 3b 7d 0a 0a 0a 73 74 61 74 69  dup(n);}...stati
09b0: 63 20 69 6e 74 20 77 72 4d 75 74 65 78 49 6e 69  c int wrMutexIni
09c0: 74 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 72  t(void){.  int r
09d0: 63 3b 0a 20 20 69 66 28 20 77 72 61 70 70 65 64  c;.  if( wrapped
09e0: 2e 6d 75 74 65 78 5f 66 61 69 6c 20 29 7b 0a 20  .mutex_fail ){. 
09f0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
0a00: 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
0a10: 20 20 20 72 63 20 3d 20 77 72 61 70 70 65 64 2e     rc = wrapped.
0a20: 6d 75 74 65 78 2e 78 4d 75 74 65 78 49 6e 69 74  mutex.xMutexInit
0a30: 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ();.  }.  if( rc
0a40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
0a50: 20 20 20 77 72 61 70 70 65 64 2e 6d 75 74 65 78     wrapped.mutex
0a60: 5f 69 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  _init = 1;.  }. 
0a70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
0a80: 61 74 69 63 20 69 6e 74 20 77 72 4d 75 74 65 78  atic int wrMutex
0a90: 45 6e 64 28 76 6f 69 64 29 7b 0a 20 20 77 72 61  End(void){.  wra
0aa0: 70 70 65 64 2e 6d 75 74 65 78 2e 78 4d 75 74 65  pped.mutex.xMute
0ab0: 78 45 6e 64 28 29 3b 0a 20 20 77 72 61 70 70 65  xEnd();.  wrappe
0ac0: 64 2e 6d 75 74 65 78 5f 69 6e 69 74 20 3d 20 30  d.mutex_init = 0
0ad0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
0ae0: 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 73  E_OK;.}.static s
0af0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 77 72  qlite3_mutex *wr
0b00: 4d 75 74 65 78 41 6c 6c 6f 63 28 69 6e 74 20 65  MutexAlloc(int e
0b10: 29 7b 0a 20 20 72 65 74 75 72 6e 20 77 72 61 70  ){.  return wrap
0b20: 70 65 64 2e 6d 75 74 65 78 2e 78 4d 75 74 65 78  ped.mutex.xMutex
0b30: 41 6c 6c 6f 63 28 65 29 3b 0a 7d 0a 73 74 61 74  Alloc(e);.}.stat
0b40: 69 63 20 76 6f 69 64 20 77 72 4d 75 74 65 78 46  ic void wrMutexF
0b50: 72 65 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  ree(sqlite3_mute
0b60: 78 20 2a 70 29 7b 0a 20 20 77 72 61 70 70 65 64  x *p){.  wrapped
0b70: 2e 6d 75 74 65 78 2e 78 4d 75 74 65 78 46 72 65  .mutex.xMutexFre
0b80: 65 28 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  e(p);.}.static v
0b90: 6f 69 64 20 77 72 4d 75 74 65 78 45 6e 74 65 72  oid wrMutexEnter
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 77 72 61 70 70 65 64 2e 6d 75  p){.  wrapped.mu
0bc0: 74 65 78 2e 78 4d 75 74 65 78 45 6e 74 65 72 28  tex.xMutexEnter(
0bd0: 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  p);.}.static int
0be0: 20 77 72 4d 75 74 65 78 54 72 79 28 73 71 6c 69   wrMutexTry(sqli
0bf0: 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20  te3_mutex *p){. 
0c00: 20 72 65 74 75 72 6e 20 77 72 61 70 70 65 64 2e   return wrapped.
0c10: 6d 75 74 65 78 2e 78 4d 75 74 65 78 54 72 79 28  mutex.xMutexTry(
0c20: 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  p);.}.static voi
0c30: 64 20 77 72 4d 75 74 65 78 4c 65 61 76 65 28 73  d wrMutexLeave(s
0c40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29  qlite3_mutex *p)
0c50: 7b 0a 20 20 77 72 61 70 70 65 64 2e 6d 75 74 65  {.  wrapped.mute
0c60: 78 2e 78 4d 75 74 65 78 4c 65 61 76 65 28 70 29  x.xMutexLeave(p)
0c70: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 77  ;.}.static int w
0c80: 72 4d 75 74 65 78 48 65 6c 64 28 73 71 6c 69 74  rMutexHeld(sqlit
0c90: 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20  e3_mutex *p){.  
0ca0: 72 65 74 75 72 6e 20 77 72 61 70 70 65 64 2e 6d  return wrapped.m
0cb0: 75 74 65 78 2e 78 4d 75 74 65 78 48 65 6c 64 28  utex.xMutexHeld(
0cc0: 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  p);.}.static int
0cd0: 20 77 72 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28   wrMutexNotheld(
0ce0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
0cf0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 77 72 61 70  ){.  return wrap
0d00: 70 65 64 2e 6d 75 74 65 78 2e 78 4d 75 74 65 78  ped.mutex.xMutex
0d10: 4e 6f 74 68 65 6c 64 28 70 29 3b 0a 7d 0a 0a 0a  Notheld(p);.}...
0d20: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 50 43  .static int wrPC
0d30: 61 63 68 65 49 6e 69 74 28 76 6f 69 64 20 2a 70  acheInit(void *p
0d40: 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Arg){.  int rc;.
0d50: 20 20 69 66 28 20 77 72 61 70 70 65 64 2e 70 63    if( wrapped.pc
0d60: 61 63 68 65 5f 66 61 69 6c 20 29 7b 0a 20 20 20  ache_fail ){.   
0d70: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
0d80: 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
0d90: 20 72 63 20 3d 20 77 72 61 70 70 65 64 2e 70 63   rc = wrapped.pc
0da0: 61 63 68 65 2e 78 49 6e 69 74 28 77 72 61 70 70  ache.xInit(wrapp
0db0: 65 64 2e 70 63 61 63 68 65 2e 70 41 72 67 29 3b  ed.pcache.pArg);
0dc0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
0dd0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
0de0: 77 72 61 70 70 65 64 2e 70 63 61 63 68 65 5f 69  wrapped.pcache_i
0df0: 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  nit = 1;.  }.  r
0e00: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
0e10: 69 63 20 76 6f 69 64 20 77 72 50 43 61 63 68 65  ic void wrPCache
0e20: 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70  Shutdown(void *p
0e30: 41 72 67 29 7b 0a 20 20 77 72 61 70 70 65 64 2e  Arg){.  wrapped.
0e40: 70 63 61 63 68 65 2e 78 53 68 75 74 64 6f 77 6e  pcache.xShutdown
0e50: 28 77 72 61 70 70 65 64 2e 70 63 61 63 68 65 2e  (wrapped.pcache.
0e60: 70 41 72 67 29 3b 0a 20 20 77 72 61 70 70 65 64  pArg);.  wrapped
0e70: 2e 70 63 61 63 68 65 5f 69 6e 69 74 20 3d 20 30  .pcache_init = 0
0e80: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 71 6c 69  ;.}..static sqli
0e90: 74 65 33 5f 70 63 61 63 68 65 20 2a 77 72 50 43  te3_pcache *wrPC
0ea0: 61 63 68 65 43 72 65 61 74 65 28 69 6e 74 20 61  acheCreate(int a
0eb0: 2c 20 69 6e 74 20 62 2c 20 69 6e 74 20 63 29 7b  , int b, int c){
0ec0: 0a 20 20 72 65 74 75 72 6e 20 77 72 61 70 70 65  .  return wrappe
0ed0: 64 2e 70 63 61 63 68 65 2e 78 43 72 65 61 74 65  d.pcache.xCreate
0ee0: 28 61 2c 20 62 2c 20 63 29 3b 0a 7d 20 20 0a 73  (a, b, c);.}  .s
0ef0: 74 61 74 69 63 20 76 6f 69 64 20 77 72 50 43 61  tatic void wrPCa
0f00: 63 68 65 43 61 63 68 65 73 69 7a 65 28 73 71 6c  cheCachesize(sql
0f10: 69 74 65 33 5f 70 63 61 63 68 65 20 2a 70 2c 20  ite3_pcache *p, 
0f20: 69 6e 74 20 6e 29 7b 0a 20 20 77 72 61 70 70 65  int n){.  wrappe
0f30: 64 2e 70 63 61 63 68 65 2e 78 43 61 63 68 65 73  d.pcache.xCaches
0f40: 69 7a 65 28 70 2c 20 6e 29 3b 0a 7d 20 20 0a 73  ize(p, n);.}  .s
0f50: 74 61 74 69 63 20 69 6e 74 20 77 72 50 43 61 63  tatic int wrPCac
0f60: 68 65 50 61 67 65 63 6f 75 6e 74 28 73 71 6c 69  hePagecount(sqli
0f70: 74 65 33 5f 70 63 61 63 68 65 20 2a 70 29 7b 0a  te3_pcache *p){.
0f80: 20 20 72 65 74 75 72 6e 20 77 72 61 70 70 65 64    return wrapped
0f90: 2e 70 63 61 63 68 65 2e 78 50 61 67 65 63 6f 75  .pcache.xPagecou
0fa0: 6e 74 28 70 29 3b 0a 7d 20 20 0a 73 74 61 74 69  nt(p);.}  .stati
0fb0: 63 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  c sqlite3_pcache
0fc0: 5f 70 61 67 65 20 2a 77 72 50 43 61 63 68 65 46  _page *wrPCacheF
0fd0: 65 74 63 68 28 73 71 6c 69 74 65 33 5f 70 63 61  etch(sqlite3_pca
0fe0: 63 68 65 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64  che *p, unsigned
0ff0: 20 61 2c 20 69 6e 74 20 62 29 7b 0a 20 20 72 65   a, int b){.  re
1000: 74 75 72 6e 20 77 72 61 70 70 65 64 2e 70 63 61  turn wrapped.pca
1010: 63 68 65 2e 78 46 65 74 63 68 28 70 2c 20 61 2c  che.xFetch(p, a,
1020: 20 62 29 3b 0a 7d 20 20 0a 73 74 61 74 69 63 20   b);.}  .static 
1030: 76 6f 69 64 20 77 72 50 43 61 63 68 65 55 6e 70  void wrPCacheUnp
1040: 69 6e 28 73 71 6c 69 74 65 33 5f 70 63 61 63 68  in(sqlite3_pcach
1050: 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 70 63  e *p, sqlite3_pc
1060: 61 63 68 65 5f 70 61 67 65 20 2a 61 2c 20 69 6e  ache_page *a, in
1070: 74 20 62 29 7b 0a 20 20 77 72 61 70 70 65 64 2e  t b){.  wrapped.
1080: 70 63 61 63 68 65 2e 78 55 6e 70 69 6e 28 70 2c  pcache.xUnpin(p,
1090: 20 61 2c 20 62 29 3b 0a 7d 20 20 0a 73 74 61 74   a, b);.}  .stat
10a0: 69 63 20 76 6f 69 64 20 77 72 50 43 61 63 68 65  ic void wrPCache
10b0: 52 65 6b 65 79 28 0a 20 20 73 71 6c 69 74 65 33  Rekey(.  sqlite3
10c0: 5f 70 63 61 63 68 65 20 2a 70 2c 20 0a 20 20 73  _pcache *p, .  s
10d0: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61  qlite3_pcache_pa
10e0: 67 65 20 2a 61 2c 20 0a 20 20 75 6e 73 69 67 6e  ge *a, .  unsign
10f0: 65 64 20 62 2c 20 0a 20 20 75 6e 73 69 67 6e 65  ed b, .  unsigne
1100: 64 20 63 0a 29 7b 0a 20 20 77 72 61 70 70 65 64  d c.){.  wrapped
1110: 2e 70 63 61 63 68 65 2e 78 52 65 6b 65 79 28 70  .pcache.xRekey(p
1120: 2c 20 61 2c 20 62 2c 20 63 29 3b 0a 7d 20 20 0a  , a, b, c);.}  .
1130: 73 74 61 74 69 63 20 76 6f 69 64 20 77 72 50 43  static void wrPC
1140: 61 63 68 65 54 72 75 6e 63 61 74 65 28 73 71 6c  acheTruncate(sql
1150: 69 74 65 33 5f 70 63 61 63 68 65 20 2a 70 2c 20  ite3_pcache *p, 
1160: 75 6e 73 69 67 6e 65 64 20 61 29 7b 0a 20 20 77  unsigned a){.  w
1170: 72 61 70 70 65 64 2e 70 63 61 63 68 65 2e 78 54  rapped.pcache.xT
1180: 72 75 6e 63 61 74 65 28 70 2c 20 61 29 3b 0a 7d  runcate(p, a);.}
1190: 20 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77    .static void w
11a0: 72 50 43 61 63 68 65 44 65 73 74 72 6f 79 28 73  rPCacheDestroy(s
11b0: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 20 2a 70  qlite3_pcache *p
11c0: 29 7b 0a 20 20 77 72 61 70 70 65 64 2e 70 63 61  ){.  wrapped.pca
11d0: 63 68 65 2e 78 44 65 73 74 72 6f 79 28 70 29 3b  che.xDestroy(p);
11e0: 0a 7d 20 20 0a 0a 73 74 61 74 69 63 20 76 6f 69  .}  ..static voi
11f0: 64 20 69 6e 73 74 61 6c 6c 49 6e 69 74 57 72 61  d installInitWra
1200: 70 70 65 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  ppers(void){.  s
1210: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74  qlite3_mutex_met
1220: 68 6f 64 73 20 6d 75 74 65 78 6d 65 74 68 6f 64  hods mutexmethod
1230: 73 20 3d 20 7b 0a 20 20 20 20 77 72 4d 75 74 65  s = {.    wrMute
1240: 78 49 6e 69 74 2c 20 20 77 72 4d 75 74 65 78 45  xInit,  wrMutexE
1250: 6e 64 2c 20 20 20 77 72 4d 75 74 65 78 41 6c 6c  nd,   wrMutexAll
1260: 6f 63 2c 0a 20 20 20 20 77 72 4d 75 74 65 78 46  oc,.    wrMutexF
1270: 72 65 65 2c 20 20 77 72 4d 75 74 65 78 45 6e 74  ree,  wrMutexEnt
1280: 65 72 2c 20 77 72 4d 75 74 65 78 54 72 79 2c 0a  er, wrMutexTry,.
1290: 20 20 20 20 77 72 4d 75 74 65 78 4c 65 61 76 65      wrMutexLeave
12a0: 2c 20 77 72 4d 75 74 65 78 48 65 6c 64 2c 20 20  , wrMutexHeld,  
12b0: 77 72 4d 75 74 65 78 4e 6f 74 68 65 6c 64 0a 20  wrMutexNotheld. 
12c0: 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 63   };.  sqlite3_pc
12d0: 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 20 70 63  ache_methods2 pc
12e0: 61 63 68 65 6d 65 74 68 6f 64 73 20 3d 20 7b 0a  achemethods = {.
12f0: 20 20 20 20 31 2c 20 30 2c 0a 20 20 20 20 77 72      1, 0,.    wr
1300: 50 43 61 63 68 65 49 6e 69 74 2c 20 20 20 20 20  PCacheInit,     
1310: 20 77 72 50 43 61 63 68 65 53 68 75 74 64 6f 77   wrPCacheShutdow
1320: 6e 2c 20 20 77 72 50 43 61 63 68 65 43 72 65 61  n,  wrPCacheCrea
1330: 74 65 2c 20 0a 20 20 20 20 77 72 50 43 61 63 68  te, .    wrPCach
1340: 65 43 61 63 68 65 73 69 7a 65 2c 20 77 72 50 43  eCachesize, wrPC
1350: 61 63 68 65 50 61 67 65 63 6f 75 6e 74 2c 20 77  achePagecount, w
1360: 72 50 43 61 63 68 65 46 65 74 63 68 2c 0a 20 20  rPCacheFetch,.  
1370: 20 20 77 72 50 43 61 63 68 65 55 6e 70 69 6e 2c    wrPCacheUnpin,
1380: 20 20 20 20 20 77 72 50 43 61 63 68 65 52 65 6b       wrPCacheRek
1390: 65 79 2c 20 20 20 20 20 77 72 50 43 61 63 68 65  ey,     wrPCache
13a0: 54 72 75 6e 63 61 74 65 2c 20 20 0a 20 20 20 20  Truncate,  .    
13b0: 77 72 50 43 61 63 68 65 44 65 73 74 72 6f 79 0a  wrPCacheDestroy.
13c0: 20 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d    };.  sqlite3_m
13d0: 65 6d 5f 6d 65 74 68 6f 64 73 20 6d 65 6d 6d 65  em_methods memme
13e0: 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 72  thods = {.    wr
13f0: 4d 65 6d 4d 61 6c 6c 6f 63 2c 20 20 20 77 72 4d  MemMalloc,   wrM
1400: 65 6d 46 72 65 65 2c 20 20 20 20 77 72 4d 65 6d  emFree,    wrMem
1410: 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 72 4d  Realloc,.    wrM
1420: 65 6d 53 69 7a 65 2c 20 20 20 20 20 77 72 4d 65  emSize,     wrMe
1430: 6d 52 6f 75 6e 64 75 70 2c 20 77 72 4d 65 6d 49  mRoundup, wrMemI
1440: 6e 69 74 2c 0a 20 20 20 20 77 72 4d 65 6d 53 68  nit,.    wrMemSh
1450: 75 74 64 6f 77 6e 2c 0a 20 20 20 20 30 0a 20 20  utdown,.    0.  
1460: 7d 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 77 72  };..  memset(&wr
1470: 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66  apped, 0, sizeof
1480: 28 77 72 61 70 70 65 64 29 29 3b 0a 0a 20 20 73  (wrapped));..  s
1490: 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
14a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  );.  sqlite3_con
14b0: 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
14c0: 47 5f 47 45 54 4d 55 54 45 58 2c 20 26 77 72 61  G_GETMUTEX, &wra
14d0: 70 70 65 64 2e 6d 75 74 65 78 29 3b 0a 20 20 73  pped.mutex);.  s
14e0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
14f0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d  LITE_CONFIG_GETM
1500: 41 4c 4c 4f 43 2c 20 26 77 72 61 70 70 65 64 2e  ALLOC, &wrapped.
1510: 6d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  mem);.  sqlite3_
1520: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
1530: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 32 2c  NFIG_GETPCACHE2,
1540: 20 26 77 72 61 70 70 65 64 2e 70 63 61 63 68 65   &wrapped.pcache
1550: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  );.  sqlite3_con
1560: 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
1570: 47 5f 4d 55 54 45 58 2c 20 26 6d 75 74 65 78 6d  G_MUTEX, &mutexm
1580: 65 74 68 6f 64 73 29 3b 0a 20 20 73 71 6c 69 74  ethods);.  sqlit
1590: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
15a0: 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20  _CONFIG_MALLOC, 
15b0: 26 6d 65 6d 6d 65 74 68 6f 64 73 29 3b 0a 20 20  &memmethods);.  
15c0: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
15d0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41  QLITE_CONFIG_PCA
15e0: 43 48 45 32 2c 20 26 70 63 61 63 68 65 6d 65 74  CHE2, &pcachemet
15f0: 68 6f 64 73 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  hods);.}..static
1600: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
1610: 50 49 20 69 6e 69 74 5f 77 72 61 70 70 65 72 5f  PI init_wrapper_
1620: 69 6e 73 74 61 6c 6c 28 0a 20 20 43 6c 69 65 6e  install(.  Clien
1630: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
1640: 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20  , /* Unused */. 
1650: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1660: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
1670: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
1680: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
1690: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
16a0: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
16b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16c0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
16d0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
16e0: 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
16f0: 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
1700: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
1710: 73 74 61 6c 6c 49 6e 69 74 57 72 61 70 70 65 72  stallInitWrapper
1720: 73 28 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  s();.  for(i=1; 
1730: 69 3c 6f 62 6a 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<objc; i++){.  
1740: 20 20 63 68 61 72 20 2a 7a 20 3d 20 54 63 6c 5f    char *z = Tcl_
1750: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69  GetString(objv[i
1760: 5d 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63  ]);.    if( strc
1770: 6d 70 28 7a 2c 20 22 6d 65 6d 22 29 3d 3d 30 20  mp(z, "mem")==0 
1780: 29 7b 0a 20 20 20 20 20 20 77 72 61 70 70 65 64  ){.      wrapped
1790: 2e 6d 65 6d 5f 66 61 69 6c 20 3d 20 31 3b 0a 20  .mem_fail = 1;. 
17a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
17b0: 63 6d 70 28 7a 2c 20 22 6d 75 74 65 78 22 29 3d  cmp(z, "mutex")=
17c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 72 61 70  =0 ){.      wrap
17d0: 70 65 64 2e 6d 75 74 65 78 5f 66 61 69 6c 20 3d  ped.mutex_fail =
17e0: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
17f0: 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 70 63 61  ( strcmp(z, "pca
1800: 63 68 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  che")==0 ){.    
1810: 20 20 77 72 61 70 70 65 64 2e 70 63 61 63 68 65    wrapped.pcache
1820: 5f 66 61 69 6c 20 3d 20 31 3b 0a 20 20 20 20 7d  _fail = 1;.    }
1830: 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
1840: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1850: 65 72 70 2c 20 22 55 6e 6b 6e 6f 77 6e 20 61 72  erp, "Unknown ar
1860: 67 75 6d 65 6e 74 3a 20 5c 22 22 2c 20 7a 2c 20  gument: \"", z, 
1870: 22 5c 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74  "\"");.      ret
1880: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1890: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
18a0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  n TCL_OK;.}..sta
18b0: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
18c0: 43 4c 41 50 49 20 69 6e 69 74 5f 77 72 61 70 70  CLAPI init_wrapp
18d0: 65 72 5f 75 6e 69 6e 73 74 61 6c 6c 28 0a 20 20  er_uninstall(.  
18e0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
18f0: 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64  tData, /* Unused
1900: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
1910: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
1920: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
1930: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
1940: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
1950: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
1960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1970: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
1980: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
1990: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
19a0: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
19b0: 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6f 62  s */.){.  if( ob
19c0: 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=1 ){.    Tcl
19d0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
19e0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
19f0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1a00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1a10: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
1a20: 6e 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63  n();.  sqlite3_c
1a30: 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
1a40: 46 49 47 5f 4d 55 54 45 58 2c 20 26 77 72 61 70  FIG_MUTEX, &wrap
1a50: 70 65 64 2e 6d 75 74 65 78 29 3b 0a 20 20 73 71  ped.mutex);.  sq
1a60: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
1a70: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
1a80: 43 2c 20 26 77 72 61 70 70 65 64 2e 6d 65 6d 29  C, &wrapped.mem)
1a90: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66  ;.  sqlite3_conf
1aa0: 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
1ab0: 5f 50 43 41 43 48 45 32 2c 20 26 77 72 61 70 70  _PCACHE2, &wrapp
1ac0: 65 64 2e 70 63 61 63 68 65 29 3b 0a 20 20 72 65  ed.pcache);.  re
1ad0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1ae0: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1af0: 45 5f 54 43 4c 41 50 49 20 69 6e 69 74 5f 77 72  E_TCLAPI init_wr
1b00: 61 70 70 65 72 5f 63 6c 65 61 72 28 0a 20 20 43  apper_clear(.  C
1b10: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
1b20: 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20  Data, /* Unused 
1b30: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
1b40: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1b50: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1b60: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1b70: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1b80: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
1b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ba0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1bb0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
1bc0: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
1bd0: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
1be0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a   */.){.  if( obj
1bf0: 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
1c00: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1c10: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22  erp, 1, objv, ""
1c20: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1c30: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1c40: 77 72 61 70 70 65 64 2e 6d 65 6d 5f 66 61 69 6c  wrapped.mem_fail
1c50: 20 3d 20 30 3b 0a 20 20 77 72 61 70 70 65 64 2e   = 0;.  wrapped.
1c60: 6d 75 74 65 78 5f 66 61 69 6c 20 3d 20 30 3b 0a  mutex_fail = 0;.
1c70: 20 20 77 72 61 70 70 65 64 2e 70 63 61 63 68 65    wrapped.pcache
1c80: 5f 66 61 69 6c 20 3d 20 30 3b 0a 20 20 72 65 74  _fail = 0;.  ret
1c90: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73  urn TCL_OK;.}..s
1ca0: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1cb0: 5f 54 43 4c 41 50 49 20 69 6e 69 74 5f 77 72 61  _TCLAPI init_wra
1cc0: 70 70 65 72 5f 71 75 65 72 79 28 0a 20 20 43 6c  pper_query(.  Cl
1cd0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
1ce0: 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a  ata, /* Unused *
1cf0: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
1d00: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
1d10: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1d20: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
1d30: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
1d40: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
1d50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1d60: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
1d70: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
1d80: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
1d90: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
1da0: 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20  */.){.  Tcl_Obj 
1db0: 2a 70 52 65 74 3b 0a 0a 20 20 69 66 28 20 6f 62  *pRet;..  if( ob
1dc0: 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=1 ){.    Tcl
1dd0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1de0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1df0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1e00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1e10: 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f   pRet = Tcl_NewO
1e20: 62 6a 28 29 3b 0a 20 20 69 66 28 20 77 72 61 70  bj();.  if( wrap
1e30: 70 65 64 2e 6d 75 74 65 78 5f 69 6e 69 74 20 29  ped.mutex_init )
1e40: 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  {.    Tcl_ListOb
1e50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1e60: 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
1e70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d  _NewStringObj("m
1e80: 75 74 65 78 22 2c 20 2d 31 29 29 3b 0a 20 20 7d  utex", -1));.  }
1e90: 0a 20 20 69 66 28 20 77 72 61 70 70 65 64 2e 6d  .  if( wrapped.m
1ea0: 65 6d 5f 69 6e 69 74 20 29 7b 0a 20 20 20 20 54  em_init ){.    T
1eb0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1ec0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1ed0: 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
1ee0: 69 6e 67 4f 62 6a 28 22 6d 65 6d 22 2c 20 2d 31  ingObj("mem", -1
1ef0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 72  ));.  }.  if( wr
1f00: 61 70 70 65 64 2e 70 63 61 63 68 65 5f 69 6e 69  apped.pcache_ini
1f10: 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  t ){.    Tcl_Lis
1f20: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1f30: 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
1f40: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1f50: 28 22 70 63 61 63 68 65 22 2c 20 2d 31 29 29 3b  ("pcache", -1));
1f60: 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 53 65 74 4f  .  }..  Tcl_SetO
1f70: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1f80: 20 70 52 65 74 29 3b 0a 20 20 72 65 74 75 72 6e   pRet);.  return
1f90: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20   TCL_OK;.}..int 
1fa0: 53 71 6c 69 74 65 74 65 73 74 5f 69 6e 69 74 5f  Sqlitetest_init_
1fb0: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
1fc0: 2a 69 6e 74 65 72 70 29 7b 0a 20 20 73 74 61 74  *interp){.  stat
1fd0: 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  ic struct {.    
1fe0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
1ff0: 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f     Tcl_ObjCmdPro
2000: 63 20 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61 4f  c *xProc;.  } aO
2010: 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  bjCmd[] = {.    
2020: 7b 22 69 6e 69 74 5f 77 72 61 70 70 65 72 5f 69  {"init_wrapper_i
2030: 6e 73 74 61 6c 6c 22 2c 20 20 20 69 6e 69 74 5f  nstall",   init_
2040: 77 72 61 70 70 65 72 5f 69 6e 73 74 61 6c 6c 7d  wrapper_install}
2050: 2c 0a 20 20 20 20 7b 22 69 6e 69 74 5f 77 72 61  ,.    {"init_wra
2060: 70 70 65 72 5f 71 75 65 72 79 22 2c 20 20 20 20  pper_query",    
2070: 20 69 6e 69 74 5f 77 72 61 70 70 65 72 5f 71 75   init_wrapper_qu
2080: 65 72 79 20 20 7d 2c 0a 20 20 20 20 7b 22 69 6e  ery  },.    {"in
2090: 69 74 5f 77 72 61 70 70 65 72 5f 75 6e 69 6e 73  it_wrapper_unins
20a0: 74 61 6c 6c 22 2c 20 69 6e 69 74 5f 77 72 61 70  tall", init_wrap
20b0: 70 65 72 5f 75 6e 69 6e 73 74 61 6c 6c 7d 2c 0a  per_uninstall},.
20c0: 20 20 20 20 7b 22 69 6e 69 74 5f 77 72 61 70 70      {"init_wrapp
20d0: 65 72 5f 63 6c 65 61 72 22 2c 20 20 20 20 20 69  er_clear",     i
20e0: 6e 69 74 5f 77 72 61 70 70 65 72 5f 63 6c 65 61  nit_wrapper_clea
20f0: 72 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  r}.  };.  int i;
2100: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ..  for(i=0; i<s
2110: 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73  izeof(aObjCmd)/s
2120: 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d  izeof(aObjCmd[0]
2130: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c  ); i++){.    Tcl
2140: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
2150: 64 28 69 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d  d(interp, aObjCm
2160: 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 4f 62 6a  d[i].zName, aObj
2170: 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30 2c  Cmd[i].xProc, 0,
2180: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75   0);.  }..  retu
2190: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a           rn TCL_OK;.}.