15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2007 May 05
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code.  In place of
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a legal notice, here is a blessing:
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you do good and not evil.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you find forgiveness for yourself and forgive others.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you share freely, never taking more than you give.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*************************************************************************
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Code for testing the btree.c module in SQLite.  This code
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is not included in the SQLite library.  It is used for automated
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** testing of the SQLite library.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "btreeInt.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <tcl.h>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_shared_cache_report
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return a list of file that are shared and the number of
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** references to each file.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3BtreeSharedCacheReport(
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void * clientData,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_Interp *interp,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int objc,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_Obj *CONST objv[]
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SHARED_CACHE
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extern BtShared *sqlite3SharedCacheList;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BtShared *pBt;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_Obj *pRet = Tcl_NewObj();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(pBt=GLOBAL(BtShared*,sqlite3SharedCacheList); pBt; pBt=pBt->pNext){
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *zFile = sqlite3PagerFilename(pBt->pPager);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Tcl_ListObjAppendElement(interp, pRet, Tcl_NewStringObj(zFile, -1));
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Tcl_ListObjAppendElement(interp, pRet, Tcl_NewIntObj(pBt->nRef));
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_SetObjResult(interp, pRet);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TCL_OK;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Print debugging information about all cursors to standard output.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3BtreeCursorList(Btree *p){
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BtCursor *pCur;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BtShared *pBt = p->pBt;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(pCur=pBt->pCursor; pCur; pCur=pCur->pNext){
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MemPage *pPage = pCur->apPage[pCur->iPage];
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *zMode = pCur->wrFlag ? "rw" : "ro";
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DebugPrintf("CURSOR %p rooted at %4d(%s) currently at %d.%d%s\n",
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       pCur, pCur->pgnoRoot, zMode,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       pPage ? pPage->pgno : 0, pCur->aiIdx[pCur->iPage],
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       (pCur->eState==CURSOR_VALID) ? "" : " eof"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    );
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
63