| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 ** 2008 June 18 | |
| 3 ** | |
| 4 ** The author disclaims copyright to this source code. In place of | |
| 5 ** a legal notice, here is a blessing: | |
| 6 ** | |
| 7 ** May you do good and not evil. | |
| 8 ** May you find forgiveness for yourself and forgive others. | |
| 9 ** May you share freely, never taking more than you give. | |
| 10 ** | |
| 11 ************************************************************************* | |
| 12 ** | |
| 13 ** This module implements the sqlite3_status() interface and related | |
| 14 ** functionality. | |
| 15 ** | |
| 16 ** $Id: status.c,v 1.9 2008/09/02 00:52:52 drh Exp $ | |
| 17 */ | |
| 18 #include "sqliteInt.h" | |
| 19 | |
| 20 /* | |
| 21 ** Variables in which to record status information. | |
| 22 */ | |
| 23 typedef struct sqlite3StatType sqlite3StatType; | |
| 24 static SQLITE_WSD struct sqlite3StatType { | |
| 25 int nowValue[9]; /* Current value */ | |
| 26 int mxValue[9]; /* Maximum value */ | |
| 27 } sqlite3Stat = { {0,}, {0,} }; | |
| 28 | |
| 29 | |
| 30 /* The "wsdStat" macro will resolve to the status information | |
| 31 ** state vector. If writable static data is unsupported on the target, | |
| 32 ** we have to locate the state vector at run-time. In the more common | |
| 33 ** case where writable static data is supported, wsdStat can refer directly | |
| 34 ** to the "sqlite3Stat" state vector declared above. | |
| 35 */ | |
| 36 #ifdef SQLITE_OMIT_WSD | |
| 37 # define wsdStatInit sqlite3StatType *x = &GLOBAL(sqlite3StatType,sqlite3Stat) | |
| 38 # define wsdStat x[0] | |
| 39 #else | |
| 40 # define wsdStatInit | |
| 41 # define wsdStat sqlite3Stat | |
| 42 #endif | |
| 43 | |
| 44 /* | |
| 45 ** Return the current value of a status parameter. | |
| 46 */ | |
| 47 int sqlite3StatusValue(int op){ | |
| 48 wsdStatInit; | |
| 49 assert( op>=0 && op<ArraySize(wsdStat.nowValue) ); | |
| 50 return wsdStat.nowValue[op]; | |
| 51 } | |
| 52 | |
| 53 /* | |
| 54 ** Add N to the value of a status record. It is assumed that the | |
| 55 ** caller holds appropriate locks. | |
| 56 */ | |
| 57 void sqlite3StatusAdd(int op, int N){ | |
| 58 wsdStatInit; | |
| 59 assert( op>=0 && op<ArraySize(wsdStat.nowValue) ); | |
| 60 wsdStat.nowValue[op] += N; | |
| 61 if( wsdStat.nowValue[op]>wsdStat.mxValue[op] ){ | |
| 62 wsdStat.mxValue[op] = wsdStat.nowValue[op]; | |
| 63 } | |
| 64 } | |
| 65 | |
| 66 /* | |
| 67 ** Set the value of a status to X. | |
| 68 */ | |
| 69 void sqlite3StatusSet(int op, int X){ | |
| 70 wsdStatInit; | |
| 71 assert( op>=0 && op<ArraySize(wsdStat.nowValue) ); | |
| 72 wsdStat.nowValue[op] = X; | |
| 73 if( wsdStat.nowValue[op]>wsdStat.mxValue[op] ){ | |
| 74 wsdStat.mxValue[op] = wsdStat.nowValue[op]; | |
| 75 } | |
| 76 } | |
| 77 | |
| 78 /* | |
| 79 ** Query status information. | |
| 80 ** | |
| 81 ** This implementation assumes that reading or writing an aligned | |
| 82 ** 32-bit integer is an atomic operation. If that assumption is not true, | |
| 83 ** then this routine is not threadsafe. | |
| 84 */ | |
| 85 int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag){ | |
| 86 wsdStatInit; | |
| 87 if( op<0 || op>=ArraySize(wsdStat.nowValue) ){ | |
| 88 return SQLITE_MISUSE; | |
| 89 } | |
| 90 *pCurrent = wsdStat.nowValue[op]; | |
| 91 *pHighwater = wsdStat.mxValue[op]; | |
| 92 if( resetFlag ){ | |
| 93 wsdStat.mxValue[op] = wsdStat.nowValue[op]; | |
| 94 } | |
| 95 return SQLITE_OK; | |
| 96 } | |
| 97 | |
| 98 /* | |
| 99 ** Query status information for a single database connection | |
| 100 */ | |
| 101 int sqlite3_db_status( | |
| 102 sqlite3 *db, /* The database connection whose status is desired */ | |
| 103 int op, /* Status verb */ | |
| 104 int *pCurrent, /* Write current value here */ | |
| 105 int *pHighwater, /* Write high-water mark here */ | |
| 106 int resetFlag /* Reset high-water mark if true */ | |
| 107 ){ | |
| 108 switch( op ){ | |
| 109 case SQLITE_DBSTATUS_LOOKASIDE_USED: { | |
| 110 *pCurrent = db->lookaside.nOut; | |
| 111 *pHighwater = db->lookaside.mxOut; | |
| 112 if( resetFlag ){ | |
| 113 db->lookaside.mxOut = db->lookaside.nOut; | |
| 114 } | |
| 115 break; | |
| 116 } | |
| 117 default: { | |
| 118 return SQLITE_ERROR; | |
| 119 } | |
| 120 } | |
| 121 return SQLITE_OK; | |
| 122 } | |
| OLD | NEW |