mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-12 18:34:36 +08:00
162bd08b3f
indexes. Replace all heap_openr and index_openr calls by heap_open and index_open. Remove runtime lookups of catalog OID numbers in various places. Remove relcache's support for looking up system catalogs by name. Bulky but mostly very boring patch ...
107 lines
2.0 KiB
C
107 lines
2.0 KiB
C
/*
|
|
* misc_utils.c --
|
|
*
|
|
* This file defines miscellaneous PostgreSQL utility functions.
|
|
*
|
|
* Copyright (C) 1999, Massimo Dal Zotto <dz@cs.unitn.it>
|
|
*
|
|
* This file is distributed under the GNU General Public License
|
|
* either version 2, or (at your option) any later version.
|
|
*/
|
|
|
|
#include "postgres.h"
|
|
|
|
#include <unistd.h>
|
|
#include <signal.h>
|
|
|
|
#include "access/heapam.h"
|
|
#include "access/htup.h"
|
|
#include "access/relscan.h"
|
|
#include "access/skey.h"
|
|
#include "access/tupdesc.h"
|
|
#include "catalog/pg_listener.h"
|
|
#include "commands/async.h"
|
|
#include "fmgr.h"
|
|
#include "storage/lmgr.h"
|
|
#include "utils/fmgroids.h"
|
|
#include "utils/rel.h"
|
|
#include "utils/tqual.h"
|
|
|
|
#include "misc_utils.h"
|
|
|
|
|
|
int
|
|
backend_pid(void)
|
|
{
|
|
return getpid();
|
|
}
|
|
|
|
int
|
|
unlisten(char *relname)
|
|
{
|
|
Async_Unlisten(relname, getpid());
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
int4max(int x, int y)
|
|
{
|
|
return Max(x, y);
|
|
}
|
|
|
|
int
|
|
int4min(int x, int y)
|
|
{
|
|
return Min(x, y);
|
|
}
|
|
|
|
/*
|
|
* Return the number of active listeners on a relation name.
|
|
*/
|
|
int
|
|
active_listeners(text *relname)
|
|
{
|
|
HeapTuple lTuple;
|
|
Relation lRel;
|
|
HeapScanDesc sRel;
|
|
TupleDesc tdesc;
|
|
ScanKeyData key;
|
|
Datum d;
|
|
bool isnull;
|
|
int len,
|
|
pid;
|
|
int count = 0;
|
|
int ourpid = getpid();
|
|
char listen_name[NAMEDATALEN];
|
|
|
|
lRel = heap_open(ListenerRelationId, AccessShareLock);
|
|
tdesc = RelationGetDescr(lRel);
|
|
|
|
if (relname && (VARSIZE(relname) > VARHDRSZ))
|
|
{
|
|
MemSet(listen_name, 0, NAMEDATALEN);
|
|
len = Min(VARSIZE(relname) - VARHDRSZ, NAMEDATALEN - 1);
|
|
memcpy(listen_name, VARDATA(relname), len);
|
|
ScanKeyInit(&key,
|
|
Anum_pg_listener_relname,
|
|
BTEqualStrategyNumber, F_NAMEEQ,
|
|
PointerGetDatum(listen_name));
|
|
sRel = heap_beginscan(lRel, SnapshotNow, 1, &key);
|
|
}
|
|
else
|
|
sRel = heap_beginscan(lRel, SnapshotNow, 0, (ScanKey) NULL);
|
|
|
|
while ((lTuple = heap_getnext(sRel, ForwardScanDirection)) != NULL)
|
|
{
|
|
d = heap_getattr(lTuple, Anum_pg_listener_pid, tdesc, &isnull);
|
|
pid = DatumGetInt32(d);
|
|
if ((pid == ourpid) || (kill(pid, 0) == 0))
|
|
count++;
|
|
}
|
|
heap_endscan(sRel);
|
|
|
|
heap_close(lRel, AccessShareLock);
|
|
|
|
return count;
|
|
}
|