pgstatfuncs.c
来自「postgresql8.3.4源码,开源数据库」· C语言 代码 · 共 849 行 · 第 1/2 页
C
849 行
/*------------------------------------------------------------------------- * * pgstatfuncs.c * Functions for accessing the statistics collector data * * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION * $PostgreSQL: pgsql/src/backend/utils/adt/pgstatfuncs.c,v 1.48 2008/01/01 19:45:52 momjian Exp $ * *------------------------------------------------------------------------- */#include "postgres.h"#include "funcapi.h"#include "miscadmin.h"#include "pgstat.h"#include "utils/builtins.h"#include "utils/inet.h"#include "libpq/ip.h"/* bogus ... these externs should be in a header file */extern Datum pg_stat_get_numscans(PG_FUNCTION_ARGS);extern Datum pg_stat_get_tuples_returned(PG_FUNCTION_ARGS);extern Datum pg_stat_get_tuples_fetched(PG_FUNCTION_ARGS);extern Datum pg_stat_get_tuples_inserted(PG_FUNCTION_ARGS);extern Datum pg_stat_get_tuples_updated(PG_FUNCTION_ARGS);extern Datum pg_stat_get_tuples_deleted(PG_FUNCTION_ARGS);extern Datum pg_stat_get_tuples_hot_updated(PG_FUNCTION_ARGS);extern Datum pg_stat_get_live_tuples(PG_FUNCTION_ARGS);extern Datum pg_stat_get_dead_tuples(PG_FUNCTION_ARGS);extern Datum pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS);extern Datum pg_stat_get_blocks_hit(PG_FUNCTION_ARGS);extern Datum pg_stat_get_last_vacuum_time(PG_FUNCTION_ARGS);extern Datum pg_stat_get_last_autovacuum_time(PG_FUNCTION_ARGS);extern Datum pg_stat_get_last_analyze_time(PG_FUNCTION_ARGS);extern Datum pg_stat_get_last_autoanalyze_time(PG_FUNCTION_ARGS);extern Datum pg_stat_get_backend_idset(PG_FUNCTION_ARGS);extern Datum pg_backend_pid(PG_FUNCTION_ARGS);extern Datum pg_stat_get_backend_pid(PG_FUNCTION_ARGS);extern Datum pg_stat_get_backend_dbid(PG_FUNCTION_ARGS);extern Datum pg_stat_get_backend_userid(PG_FUNCTION_ARGS);extern Datum pg_stat_get_backend_activity(PG_FUNCTION_ARGS);extern Datum pg_stat_get_backend_waiting(PG_FUNCTION_ARGS);extern Datum pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS);extern Datum pg_stat_get_backend_xact_start(PG_FUNCTION_ARGS);extern Datum pg_stat_get_backend_start(PG_FUNCTION_ARGS);extern Datum pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS);extern Datum pg_stat_get_backend_client_port(PG_FUNCTION_ARGS);extern Datum pg_stat_get_db_numbackends(PG_FUNCTION_ARGS);extern Datum pg_stat_get_db_xact_commit(PG_FUNCTION_ARGS);extern Datum pg_stat_get_db_xact_rollback(PG_FUNCTION_ARGS);extern Datum pg_stat_get_db_blocks_fetched(PG_FUNCTION_ARGS);extern Datum pg_stat_get_db_blocks_hit(PG_FUNCTION_ARGS);extern Datum pg_stat_get_db_tuples_returned(PG_FUNCTION_ARGS);extern Datum pg_stat_get_db_tuples_fetched(PG_FUNCTION_ARGS);extern Datum pg_stat_get_db_tuples_inserted(PG_FUNCTION_ARGS);extern Datum pg_stat_get_db_tuples_updated(PG_FUNCTION_ARGS);extern Datum pg_stat_get_db_tuples_deleted(PG_FUNCTION_ARGS);extern Datum pg_stat_get_bgwriter_timed_checkpoints(PG_FUNCTION_ARGS);extern Datum pg_stat_get_bgwriter_requested_checkpoints(PG_FUNCTION_ARGS);extern Datum pg_stat_get_bgwriter_buf_written_checkpoints(PG_FUNCTION_ARGS);extern Datum pg_stat_get_bgwriter_buf_written_clean(PG_FUNCTION_ARGS);extern Datum pg_stat_get_bgwriter_maxwritten_clean(PG_FUNCTION_ARGS);extern Datum pg_stat_get_buf_written_backend(PG_FUNCTION_ARGS);extern Datum pg_stat_get_buf_alloc(PG_FUNCTION_ARGS);extern Datum pg_stat_clear_snapshot(PG_FUNCTION_ARGS);extern Datum pg_stat_reset(PG_FUNCTION_ARGS);/* Global bgwriter statistics, from bgwriter.c */extern PgStat_MsgBgWriter bgwriterStats;Datumpg_stat_get_numscans(PG_FUNCTION_ARGS){ Oid relid = PG_GETARG_OID(0); int64 result; PgStat_StatTabEntry *tabentry; if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) result = 0; else result = (int64) (tabentry->numscans); PG_RETURN_INT64(result);}Datumpg_stat_get_tuples_returned(PG_FUNCTION_ARGS){ Oid relid = PG_GETARG_OID(0); int64 result; PgStat_StatTabEntry *tabentry; if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) result = 0; else result = (int64) (tabentry->tuples_returned); PG_RETURN_INT64(result);}Datumpg_stat_get_tuples_fetched(PG_FUNCTION_ARGS){ Oid relid = PG_GETARG_OID(0); int64 result; PgStat_StatTabEntry *tabentry; if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) result = 0; else result = (int64) (tabentry->tuples_fetched); PG_RETURN_INT64(result);}Datumpg_stat_get_tuples_inserted(PG_FUNCTION_ARGS){ Oid relid = PG_GETARG_OID(0); int64 result; PgStat_StatTabEntry *tabentry; if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) result = 0; else result = (int64) (tabentry->tuples_inserted); PG_RETURN_INT64(result);}Datumpg_stat_get_tuples_updated(PG_FUNCTION_ARGS){ Oid relid = PG_GETARG_OID(0); int64 result; PgStat_StatTabEntry *tabentry; if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) result = 0; else result = (int64) (tabentry->tuples_updated); PG_RETURN_INT64(result);}Datumpg_stat_get_tuples_deleted(PG_FUNCTION_ARGS){ Oid relid = PG_GETARG_OID(0); int64 result; PgStat_StatTabEntry *tabentry; if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) result = 0; else result = (int64) (tabentry->tuples_deleted); PG_RETURN_INT64(result);}Datumpg_stat_get_tuples_hot_updated(PG_FUNCTION_ARGS){ Oid relid = PG_GETARG_OID(0); int64 result; PgStat_StatTabEntry *tabentry; if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) result = 0; else result = (int64) (tabentry->tuples_hot_updated); PG_RETURN_INT64(result);}Datumpg_stat_get_live_tuples(PG_FUNCTION_ARGS){ Oid relid = PG_GETARG_OID(0); int64 result; PgStat_StatTabEntry *tabentry; if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) result = 0; else result = (int64) (tabentry->n_live_tuples); PG_RETURN_INT64(result);}Datumpg_stat_get_dead_tuples(PG_FUNCTION_ARGS){ Oid relid = PG_GETARG_OID(0); int64 result; PgStat_StatTabEntry *tabentry; if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) result = 0; else result = (int64) (tabentry->n_dead_tuples); PG_RETURN_INT64(result);}Datumpg_stat_get_blocks_fetched(PG_FUNCTION_ARGS){ Oid relid = PG_GETARG_OID(0); int64 result; PgStat_StatTabEntry *tabentry; if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) result = 0; else result = (int64) (tabentry->blocks_fetched); PG_RETURN_INT64(result);}Datumpg_stat_get_blocks_hit(PG_FUNCTION_ARGS){ Oid relid = PG_GETARG_OID(0); int64 result; PgStat_StatTabEntry *tabentry; if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) result = 0; else result = (int64) (tabentry->blocks_hit); PG_RETURN_INT64(result);}Datumpg_stat_get_last_vacuum_time(PG_FUNCTION_ARGS){ Oid relid = PG_GETARG_OID(0); TimestampTz result; PgStat_StatTabEntry *tabentry; if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) result = 0; else result = tabentry->vacuum_timestamp; if (result == 0) PG_RETURN_NULL(); else PG_RETURN_TIMESTAMPTZ(result);}Datumpg_stat_get_last_autovacuum_time(PG_FUNCTION_ARGS){ Oid relid = PG_GETARG_OID(0); TimestampTz result; PgStat_StatTabEntry *tabentry; if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) result = 0; else result = tabentry->autovac_vacuum_timestamp; if (result == 0) PG_RETURN_NULL(); else PG_RETURN_TIMESTAMPTZ(result);}Datumpg_stat_get_last_analyze_time(PG_FUNCTION_ARGS){ Oid relid = PG_GETARG_OID(0); TimestampTz result; PgStat_StatTabEntry *tabentry; if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) result = 0; else result = tabentry->analyze_timestamp; if (result == 0) PG_RETURN_NULL(); else PG_RETURN_TIMESTAMPTZ(result);}Datumpg_stat_get_last_autoanalyze_time(PG_FUNCTION_ARGS){ Oid relid = PG_GETARG_OID(0); TimestampTz result; PgStat_StatTabEntry *tabentry; if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) result = 0; else result = tabentry->autovac_analyze_timestamp; if (result == 0) PG_RETURN_NULL(); else PG_RETURN_TIMESTAMPTZ(result);}Datumpg_stat_get_backend_idset(PG_FUNCTION_ARGS){ FuncCallContext *funcctx; int *fctx; int32 result; /* stuff done only on the first call of the function */ if (SRF_IS_FIRSTCALL()) { /* create a function context for cross-call persistence */ funcctx = SRF_FIRSTCALL_INIT(); fctx = MemoryContextAlloc(funcctx->multi_call_memory_ctx, 2 * sizeof(int)); funcctx->user_fctx = fctx; fctx[0] = 0; fctx[1] = pgstat_fetch_stat_numbackends(); } /* stuff done on every call of the function */ funcctx = SRF_PERCALL_SETUP(); fctx = funcctx->user_fctx; fctx[0] += 1; result = fctx[0]; if (result <= fctx[1]) { /* do when there is more left to send */ SRF_RETURN_NEXT(funcctx, Int32GetDatum(result)); } else { /* do when there is no more left */ SRF_RETURN_DONE(funcctx); }}Datumpg_backend_pid(PG_FUNCTION_ARGS){ PG_RETURN_INT32(MyProcPid);}Datumpg_stat_get_backend_pid(PG_FUNCTION_ARGS){ int32 beid = PG_GETARG_INT32(0); PgBackendStatus *beentry; if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL) PG_RETURN_NULL(); PG_RETURN_INT32(beentry->st_procpid);}Datumpg_stat_get_backend_dbid(PG_FUNCTION_ARGS){ int32 beid = PG_GETARG_INT32(0); PgBackendStatus *beentry; if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL) PG_RETURN_NULL(); PG_RETURN_OID(beentry->st_databaseid);}Datumpg_stat_get_backend_userid(PG_FUNCTION_ARGS){ int32 beid = PG_GETARG_INT32(0); PgBackendStatus *beentry; if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL) PG_RETURN_NULL(); PG_RETURN_OID(beentry->st_userid);}Datumpg_stat_get_backend_activity(PG_FUNCTION_ARGS){ int32 beid = PG_GETARG_INT32(0); text *result; PgBackendStatus *beentry; int len; const char *activity; if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL) activity = "<backend information not available>"; else if (!superuser() && beentry->st_userid != GetUserId()) activity = "<insufficient privilege>";
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?