mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 10:30:33 +03:00 
			
		
		
		
	I have updated my contrib code for version 6.5. In the attachment you will find the directories array, datetime, miscutil, string, tools and userlocks which replace the corresponding directories under contrib. In contrib/tools you will find some developement scripts which I use while hacking the sources. I hope they will be useful for some other people. I have also added a contrib/Makefile which tries to compile and install all the contribs. Unfortunately many of them don't have a Makefile or don't compile cleanly. -- Massimo Dal Zotto
		
			
				
	
	
		
			153 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * misc_utils.c --
 | |
|  *
 | |
|  * This file defines miscellaneous PostgreSQL utility functions.
 | |
|  *
 | |
|  * Copyright (c) 1998, 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 <unistd.h>
 | |
| #include <signal.h>
 | |
| #include <string.h>
 | |
| #include <errno.h>
 | |
| 
 | |
| #include "postgres.h"
 | |
| #include "access/heapam.h"
 | |
| #include "access/htup.h"
 | |
| #include "access/relscan.h"
 | |
| #include "access/skey.h"
 | |
| #include "access/tupdesc.h"
 | |
| #include "catalog/catname.h"
 | |
| #include "catalog/pg_listener.h"
 | |
| #include "storage/lmgr.h"
 | |
| #include "utils/fmgr.h"
 | |
| #include "utils/palloc.h"
 | |
| #include "utils/rel.h"
 | |
| #include "utils/tqual.h"
 | |
| 
 | |
| #include "misc_utils.h"
 | |
| 
 | |
| #define MIN(x,y)	((x)<=(y) ? (x) : (y))
 | |
| 
 | |
| extern int	ExecutorLimit(int limit);
 | |
| extern void Async_Unlisten(char *relname, int pid);
 | |
| extern int	assertTest(int val);
 | |
| 
 | |
| #ifdef ASSERT_CHECKING_TEST
 | |
| extern int	assertEnable(int val);
 | |
| #endif
 | |
| 
 | |
| int
 | |
| query_limit(int limit)
 | |
| {
 | |
| 	return ExecutorLimit(limit);
 | |
| }
 | |
| 
 | |
| int
 | |
| backend_pid()
 | |
| {
 | |
| 	return getpid();
 | |
| }
 | |
| 
 | |
| int
 | |
| unlisten(char *relname)
 | |
| {
 | |
| 	Async_Unlisten(relname, getpid());
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| int
 | |
| max(int x, int y)
 | |
| {
 | |
| 	return ((x > y) ? x : y);
 | |
| }
 | |
| 
 | |
| int
 | |
| min(int x, int y)
 | |
| {
 | |
| 	return ((x < y) ? 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_openr(ListenerRelationName);
 | |
| 	tdesc = RelationGetDescr(lRel);
 | |
| 	LockRelation(lRel, AccessShareLock);
 | |
| 
 | |
| 	if (relname && (VARSIZE(relname) > VARHDRSZ)) {
 | |
| 		len = MIN(VARSIZE(relname)-VARHDRSZ, NAMEDATALEN-1);
 | |
| 		strncpy(listen_name, VARDATA(relname), len);
 | |
| 		listen_name[len] = '\0';
 | |
| 		ScanKeyEntryInitialize(&key, 0,
 | |
| 							   Anum_pg_listener_relname,
 | |
| 							   F_NAMEEQ,
 | |
| 							   PointerGetDatum(listen_name));
 | |
| 		sRel = heap_beginscan(lRel, 0, SnapshotNow, 1, &key);
 | |
| 	} else {
 | |
| 		sRel = heap_beginscan(lRel, 0, SnapshotNow, 0, (ScanKey)NULL);
 | |
| 	}
 | |
| 
 | |
| 	while (HeapTupleIsValid(lTuple = heap_getnext(sRel, 0)))
 | |
| 	{
 | |
| 		d = heap_getattr(lTuple, Anum_pg_listener_pid, tdesc, &isnull);
 | |
| 		pid = DatumGetInt32(d);
 | |
| #ifdef HAVE_KILL
 | |
| 		if ((pid == ourpid) || (kill(pid, SIGTSTP) == 0)) {
 | |
| 			/* elog(NOTICE, "%d ok", pid); */
 | |
| 			count++;
 | |
| 		}
 | |
| #else
 | |
| 		count++;
 | |
| #endif
 | |
| 	}
 | |
| 	heap_endscan(sRel);
 | |
| 
 | |
| 	UnlockRelation(lRel, AccessShareLock);
 | |
| 	heap_close(lRel);
 | |
| 
 | |
| 	return count;
 | |
| }
 | |
| 
 | |
| int
 | |
| assert_enable(int val)
 | |
| {
 | |
| 	return assertEnable(val);
 | |
| }
 | |
| 
 | |
| #ifdef ASSERT_CHECKING_TEST
 | |
| int
 | |
| assert_test(int val)
 | |
| {
 | |
| 	return assertTest(val);
 | |
| }
 | |
| #endif
 | |
| 
 | |
| /* end of file */
 | |
| 
 | |
| /*
 | |
|  * Local Variables:
 | |
|  *  tab-width: 4
 | |
|  *  c-indent-level: 4
 | |
|  *  c-basic-offset: 4
 | |
|  * End:
 | |
|  */
 |