勇芳软件工作室.汉化:  SQLite3 API Functions > Database Connection >

sqlite3_db_status

Previous pageReturn to chapter overviewNext page

描述

 

检索有关单个数据库连接的运行时状态信息。

 

C / C ++语法

 

int sqlite3_db_status(

sqlite3*,

int op,

int *pCur,

int *pHiwtr,

int resetFlg

);

 

PB语法

 

FUNCTION sqlite3_db_status ( _

BYVAL hDbc AS DWORD, _

BYVAL op AS LONG, _

BYREF pCur AS LONG, _

BYREF pHiwtr AS LONG, _

BYVAL resetFlag AS LONG _

) AS LONG

 

参数

 

pDb

 

[in]要查询的数据库连接对象。必须是从sqlite3_opensqlite3_open16sqlite3_open_v2获取的sqlite3对象指针。 数据库连接不能关闭。

 

op

 

[in]一组整数常数,取自SQLITE_DBSTATUS选项集,用于确定要查询的参数。

 

%SQLITE_DBSTATUS_LOOKASIDE_USED      = 0

%SQLITE_DBSTATUS_CACHE_USED          = 1

%SQLITE_DBSTATUS_SCHEMA_USED         = 2

%SQLITE_DBSTATUS_STMT_USED           = 3

%SQLITE_DBSTATUS_LOOKASIDE_HIT       = 4

%SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE = 5

%SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL = 6

%SQLITE_DBSTATUS_CACHE_HIT           = 7

%SQLITE_DBSTATUS_CACHE_MISS          = 8

%SQLITE_DBSTATUS_CACHE_WRITE         = 9

 

pCur

 

[out]请求参数的当前值。

 

pHiwtr

 

[out]最高瞬时值。

 

resetFlag

 

[out]TRUE或FALSE。如果为真,那么最高瞬时值将被复位回当前值。

 

返回值

 

SQLITE_OK成功,失败时出现非零错误代码。

 

C ++实现代码

 

/*

** Query status information for a single database connection

*/

SQLITE_API int sqlite3_db_status(

sqlite3 *db,          /* The database connection whose status is desired */

int op,               /* Status verb */

int *pCurrent,        /* Write current value here */

int *pHighwater,      /* Write high-water mark here */

int resetFlag         /* Reset high-water mark if true */

){

int rc = SQLITE_OK;   /* Return code */

sqlite3_mutex_enter(db->mutex);

switch( op ){

  case SQLITE_DBSTATUS_LOOKASIDE_USED: {

    *pCurrent = db->lookaside.nOut;

    *pHighwater = db->lookaside.mxOut;

    if( resetFlag ){

      db->lookaside.mxOut = db->lookaside.nOut;

    }

    break;

  }

 

  case SQLITE_DBSTATUS_LOOKASIDE_HIT:

  case SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE:

  case SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL: {

    testcase( op==SQLITE_DBSTATUS_LOOKASIDE_HIT );

    testcase( op==SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE );

    testcase( op==SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL );

    assert( (op-SQLITE_DBSTATUS_LOOKASIDE_HIT)>=0 );

    assert( (op-SQLITE_DBSTATUS_LOOKASIDE_HIT)<3 );

    *pCurrent = 0;

    *pHighwater = db->lookaside.anStat[op - SQLITE_DBSTATUS_LOOKASIDE_HIT];

    if( resetFlag ){

      db->lookaside.anStat[op - SQLITE_DBSTATUS_LOOKASIDE_HIT] = 0;

    }

    break;

  }

 

  /*

  ** Return an approximation for the amount of memory currently used

  ** by all pagers associated with the given database connection.  The

  ** highwater mark is meaningless and is returned as zero.

  */

  case SQLITE_DBSTATUS_CACHE_USED: {

    int totalUsed = 0;

    int i;

    sqlite3BtreeEnterAll(db);

    for(i=0; i<db->nDb; i++){

      Btree *pBt = db->aDb[i].pBt;

      if( pBt ){

        Pager *pPager = sqlite3BtreePager(pBt);

        totalUsed += sqlite3PagerMemUsed(pPager);

      }

    }

    sqlite3BtreeLeaveAll(db);

    *pCurrent = totalUsed;

    *pHighwater = 0;

    break;

  }

 

  /*

  ** *pCurrent gets an accurate estimate of the amount of memory used

  ** to store the schema for all databases (main, temp, and any ATTACHed

  ** databases.  *pHighwater is set to zero.

  */

  case SQLITE_DBSTATUS_SCHEMA_USED: {

    int i;                      /* Used to iterate through schemas */

    int nByte = 0;              /* Used to accumulate return value */

 

    sqlite3BtreeEnterAll(db);

    db->pnBytesFreed = &nByte;

    for(i=0; i<db->nDb; i++){

      Schema *pSchema = db->aDb[i].pSchema;

      if( ALWAYS(pSchema!=0) ){

        HashElem *p;

 

        nByte += sqlite3GlobalConfig.m.xRoundup(sizeof(HashElem)) * (

            pSchema->tblHash.count

          + pSchema->trigHash.count

          + pSchema->idxHash.count

          + pSchema->fkeyHash.count

        );

        nByte += sqlite3MallocSize(pSchema->tblHash.ht);

        nByte += sqlite3MallocSize(pSchema->trigHash.ht);

        nByte += sqlite3MallocSize(pSchema->idxHash.ht);

        nByte += sqlite3MallocSize(pSchema->fkeyHash.ht);

 

        for(p=sqliteHashFirst(&pSchema->trigHash); p; p=sqliteHashNext(p)){

          sqlite3DeleteTrigger(db, (Trigger*)sqliteHashData(p));

        }

        for(p=sqliteHashFirst(&pSchema->tblHash); p; p=sqliteHashNext(p)){

          sqlite3DeleteTable(db, (Table *)sqliteHashData(p));

        }

      }

    }

    db->pnBytesFreed = 0;

    sqlite3BtreeLeaveAll(db);

 

    *pHighwater = 0;

    *pCurrent = nByte;

    break;

  }

 

  /*

  ** *pCurrent gets an accurate estimate of the amount of memory used

  ** to store all prepared statements.

  ** *pHighwater is set to zero.

  */

  case SQLITE_DBSTATUS_STMT_USED: {

    struct Vdbe *pVdbe;         /* Used to iterate through VMs */

    int nByte = 0;              /* Used to accumulate return value */

 

    db->pnBytesFreed = &nByte;

    for(pVdbe=db->pVdbe; pVdbe; pVdbe=pVdbe->pNext){

      sqlite3VdbeDeleteObject(db, pVdbe);

    }

    db->pnBytesFreed = 0;

 

    *pHighwater = 0;

    *pCurrent = nByte;

 

    break;

  }

 

  /*

  ** Set *pCurrent to the total cache hits or misses encountered by all

  ** pagers the database handle is connected to. *pHighwater is always set

  ** to zero.

  */

  case SQLITE_DBSTATUS_CACHE_HIT:

  case SQLITE_DBSTATUS_CACHE_MISS:

  case SQLITE_DBSTATUS_CACHE_WRITE:{

    int i;

    int nRet = 0;

    assert( SQLITE_DBSTATUS_CACHE_MISS==SQLITE_DBSTATUS_CACHE_HIT+1 );

    assert( SQLITE_DBSTATUS_CACHE_WRITE==SQLITE_DBSTATUS_CACHE_HIT+2 );

 

    for(i=0; i<db->nDb; i++){

      if( db->aDb[i].pBt ){

        Pager *pPager = sqlite3BtreePager(db->aDb[i].pBt);

        sqlite3PagerCacheStat(pPager, op, resetFlag, &nRet);

      }

    }

    *pHighwater = 0;

    *pCurrent = nRet;

    break;

  }

 

  default: {

    rc = SQLITE_ERROR;

  }

}

sqlite3_mutex_leave(db->mutex);

return rc;

}