⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 postgres.h

📁 从一个开源软件中摘取的正则表达式模块
💻 H
字号:
/*------------------------------------------------------------------------- * * postgres.h *	  Primary include file for PostgreSQL server .c files * * This should be the first file included by PostgreSQL backend modules. * Client-side code should include postgres_fe.h instead. * * * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1995, Regents of the University of California * * $PostgreSQL: pgsql/src/include/postgres.h,v 1.88 2008/01/01 19:45:56 momjian Exp $ * *------------------------------------------------------------------------- *//* *---------------------------------------------------------------- *	 TABLE OF CONTENTS * *		When adding stuff to this file, please try to put stuff *		into the relevant section, or add new sections as appropriate. * *	  section	description *	  -------	------------------------------------------------ *		1)		variable-length datatypes (TOAST support) *		2)		datum type + support macros *		3)		exception handling definitions *		4)		genbki macros used by catalog/pg_xxx.h files * *	 NOTES * *	In general, this file should contain declarations that are widely needed *	in the backend environment, but are of no interest outside the backend. * *	Simple type definitions live in c.h, where they are shared with *	postgres_fe.h.	We do that since those type definitions are needed by *	frontend modules that want to deal with binary data transmission to or *	from the backend.  Type definitions in this file should be for *	representations that never escape the backend, such as Datum or *	TOASTed varlena objects. * *---------------------------------------------------------------- */#ifndef POSTGRES_H#define POSTGRES_H#include "c.h"/* ---------------------------------------------------------------- *				Section 1:	variable-length datatypes (TOAST support) * ---------------------------------------------------------------- *//* * struct varatt_external is a "TOAST pointer", that is, the information * needed to fetch a stored-out-of-line Datum.	The data is compressed * if and only if va_extsize < va_rawsize - VARHDRSZ.  This struct must not * contain any padding, because we sometimes compare pointers using memcmp. * * Note that this information is stored unaligned within actual tuples, so * you need to memcpy from the tuple into a local struct variable before * you can look at these fields!  (The reason we use memcmp is to avoid * having to do that just to detect equality of two TOAST pointers...) *//* * These structs describe the header of a varlena object that may have been * TOASTed.  Generally, don't reference these structs directly, but use the * macros below. * * We use separate structs for the aligned and unaligned cases because the * compiler might otherwise think it could generate code that assumes * alignment while touching fields of a 1-byte-header varlena. */typedef union{	struct						/* Normal varlena (4-byte length) */	{		uint32		va_header;		char		va_data[1];	}		va_4byte;	struct						/* Compressed-in-line format */	{		uint32		va_header;		uint32		va_rawsize; /* Original data size (excludes header) */		char		va_data[1]; /* Compressed data */	}		va_compressed;} varattrib_4b;typedef struct{	uint8		va_header;	char		va_data[1];		/* Data begins here */} varattrib_1b;typedef struct{	uint8		va_header;		/* Always 0x80 or 0x01 */	uint8		va_len_1be;		/* Physical length of datum */	char		va_data[1];		/* Data (for now always a TOAST pointer) */} varattrib_1b_e;/* * Bit layouts for varlena headers on big-endian machines: * * 00xxxxxx 4-byte length word, aligned, uncompressed data (up to 1G) * 01xxxxxx 4-byte length word, aligned, *compressed* data (up to 1G) * 10000000 1-byte length word, unaligned, TOAST pointer * 1xxxxxxx 1-byte length word, unaligned, uncompressed data (up to 126b) * * Bit layouts for varlena headers on little-endian machines: * * xxxxxx00 4-byte length word, aligned, uncompressed data (up to 1G) * xxxxxx10 4-byte length word, aligned, *compressed* data (up to 1G) * 00000001 1-byte length word, unaligned, TOAST pointer * xxxxxxx1 1-byte length word, unaligned, uncompressed data (up to 126b) * * The "xxx" bits are the length field (which includes itself in all cases). * In the big-endian case we mask to extract the length, in the little-endian * case we shift.  Note that in both cases the flag bits are in the physically * first byte.	Also, it is not possible for a 1-byte length word to be zero; * this lets us disambiguate alignment padding bytes from the start of an * unaligned datum.  (We now *require* pad bytes to be filled with zero!) *//* * Endian-dependent macros.  These are considered internal --- use the * external macros below instead of using these directly. * * Note: IS_1B is true for external toast records but VARSIZE_1B will return 0 * for such records. Hence you should usually check for IS_EXTERNAL before * checking for IS_1B. */#ifdef WORDS_BIGENDIAN#define VARATT_IS_4B(PTR) \	((((varattrib_1b *) (PTR))->va_header & 0x80) == 0x00)#define VARATT_IS_4B_U(PTR) \	((((varattrib_1b *) (PTR))->va_header & 0xC0) == 0x00)#define VARATT_IS_4B_C(PTR) \	((((varattrib_1b *) (PTR))->va_header & 0xC0) == 0x40)#define VARATT_IS_1B(PTR) \	((((varattrib_1b *) (PTR))->va_header & 0x80) == 0x80)#define VARATT_IS_1B_E(PTR) \	((((varattrib_1b *) (PTR))->va_header) == 0x80)#define VARATT_NOT_PAD_BYTE(PTR) \	(*((uint8 *) (PTR)) != 0)/* VARSIZE_4B() should only be used on known-aligned data */#define VARSIZE_4B(PTR) \	(((varattrib_4b *) (PTR))->va_4byte.va_header & 0x3FFFFFFF)#define VARSIZE_1B(PTR) \	(((varattrib_1b *) (PTR))->va_header & 0x7F)#define VARSIZE_1B_E(PTR) \	(((varattrib_1b_e *) (PTR))->va_len_1be)#define SET_VARSIZE_4B(PTR,len) \	(((varattrib_4b *) (PTR))->va_4byte.va_header = (len) & 0x3FFFFFFF)#define SET_VARSIZE_4B_C(PTR,len) \	(((varattrib_4b *) (PTR))->va_4byte.va_header = ((len) & 0x3FFFFFFF) | 0x40000000)#define SET_VARSIZE_1B(PTR,len) \	(((varattrib_1b *) (PTR))->va_header = (len) | 0x80)#define SET_VARSIZE_1B_E(PTR,len) \	(((varattrib_1b_e *) (PTR))->va_header = 0x80, \	 ((varattrib_1b_e *) (PTR))->va_len_1be = (len))#else							/* !WORDS_BIGENDIAN */#define VARATT_IS_4B(PTR) \	((((varattrib_1b *) (PTR))->va_header & 0x01) == 0x00)#define VARATT_IS_4B_U(PTR) \	((((varattrib_1b *) (PTR))->va_header & 0x03) == 0x00)#define VARATT_IS_4B_C(PTR) \	((((varattrib_1b *) (PTR))->va_header & 0x03) == 0x02)#define VARATT_IS_1B(PTR) \	((((varattrib_1b *) (PTR))->va_header & 0x01) == 0x01)#define VARATT_IS_1B_E(PTR) \	((((varattrib_1b *) (PTR))->va_header) == 0x01)#define VARATT_NOT_PAD_BYTE(PTR) \	(*((uint8 *) (PTR)) != 0)/* VARSIZE_4B() should only be used on known-aligned data */#define VARSIZE_4B(PTR) \	((((varattrib_4b *) (PTR))->va_4byte.va_header >> 2) & 0x3FFFFFFF)#define VARSIZE_1B(PTR) \	((((varattrib_1b *) (PTR))->va_header >> 1) & 0x7F)#define VARSIZE_1B_E(PTR) \	(((varattrib_1b_e *) (PTR))->va_len_1be)#define SET_VARSIZE_4B(PTR,len) \	(((varattrib_4b *) (PTR))->va_4byte.va_header = (((uint32) (len)) << 2))#define SET_VARSIZE_4B_C(PTR,len) \	(((varattrib_4b *) (PTR))->va_4byte.va_header = (((uint32) (len)) << 2) | 0x02)#define SET_VARSIZE_1B(PTR,len) \	(((varattrib_1b *) (PTR))->va_header = (((uint8) (len)) << 1) | 0x01)#define SET_VARSIZE_1B_E(PTR,len) \	(((varattrib_1b_e *) (PTR))->va_header = 0x01, \	 ((varattrib_1b_e *) (PTR))->va_len_1be = (len))#endif   /* WORDS_BIGENDIAN */#define VARHDRSZ_SHORT			1#define VARATT_SHORT_MAX		0x7F#define VARATT_CAN_MAKE_SHORT(PTR) \	(VARATT_IS_4B_U(PTR) && \	 (VARSIZE(PTR) - VARHDRSZ + VARHDRSZ_SHORT) <= VARATT_SHORT_MAX)#define VARATT_CONVERTED_SHORT_SIZE(PTR) \	(VARSIZE(PTR) - VARHDRSZ + VARHDRSZ_SHORT)#define VARHDRSZ_EXTERNAL		2#define VARDATA_4B(PTR)		(((varattrib_4b *) (PTR))->va_4byte.va_data)#define VARDATA_4B_C(PTR)	(((varattrib_4b *) (PTR))->va_compressed.va_data)#define VARDATA_1B(PTR)		(((varattrib_1b *) (PTR))->va_data)#define VARDATA_1B_E(PTR)	(((varattrib_1b_e *) (PTR))->va_data)#define VARRAWSIZE_4B_C(PTR) \	(((varattrib_4b *) (PTR))->va_compressed.va_rawsize)/* Externally visible macros *//* * VARDATA, VARSIZE, and SET_VARSIZE are the recommended API for most code * for varlena datatypes.  Note that they only work on untoasted, 4-byte-header Datums! * VARDATA,VARSize 和 SET_WARSIZE是 arlena数据类型推荐使用的API。 * * Code that wants to use 1-byte-header values without detoasting should * use VARSIZE_ANY/VARSIZE_ANY_EXHDR/VARDATA_ANY.  The other macros here * VARSIZE_ANY 获取指定指针的数据长度 * VARSIZE_ANY_EXHER * should usually be used only by tuple assembly/disassembly code and * code that specifically wants to work with still-toasted Datums. * * WARNING: It is only safe to use VARDATA_ANY() -- typically with * PG_DETOAST_DATUM_PACKED() -- if you really don't care about the alignment. * Either because you're working with something like text where the alignment * doesn't matter or because you're not going to access its constituent parts * and just use things like memcpy on it anyways. */#define VARDATA(PTR)						VARDATA_4B(PTR)#define VARSIZE(PTR)						VARSIZE_4B(PTR)#define VARSIZE_SHORT(PTR)					VARSIZE_1B(PTR)#define VARDATA_SHORT(PTR)					VARDATA_1B(PTR)#define VARSIZE_EXTERNAL(PTR)				VARSIZE_1B_E(PTR)#define VARDATA_EXTERNAL(PTR)				VARDATA_1B_E(PTR)#define VARATT_IS_COMPRESSED(PTR)			VARATT_IS_4B_C(PTR)#define VARATT_IS_EXTERNAL(PTR)				VARATT_IS_1B_E(PTR)#define VARATT_IS_SHORT(PTR)				VARATT_IS_1B(PTR)#define VARATT_IS_EXTENDED(PTR)				(!VARATT_IS_4B_U(PTR))#define SET_VARSIZE(PTR, len)				SET_VARSIZE_4B(PTR, len)#define SET_VARSIZE_SHORT(PTR, len)			SET_VARSIZE_1B(PTR, len)#define SET_VARSIZE_COMPRESSED(PTR, len)	SET_VARSIZE_4B_C(PTR, len)#define SET_VARSIZE_EXTERNAL(PTR, len)		SET_VARSIZE_1B_E(PTR, len)#define VARSIZE_ANY(PTR) \	(VARATT_IS_1B_E(PTR) ? VARSIZE_1B_E(PTR) : \	 (VARATT_IS_1B(PTR) ? VARSIZE_1B(PTR) : \	  VARSIZE_4B(PTR)))#define VARSIZE_ANY_EXHDR(PTR) \	(VARATT_IS_1B_E(PTR) ? VARSIZE_1B_E(PTR)-VARHDRSZ_EXTERNAL : \	 (VARATT_IS_1B(PTR) ? VARSIZE_1B(PTR)-VARHDRSZ_SHORT : \	  VARSIZE_4B(PTR)-VARHDRSZ))/* caution: this will not work on an external or compressed-in-line Datum *//* caution: this will return a possibly unaligned pointer */#define VARDATA_ANY(PTR) \	 (VARATT_IS_1B(PTR) ? VARDATA_1B(PTR) : VARDATA_4B(PTR))/* ---------------------------------------------------------------- *				Section 2:	datum type + support macros * ---------------------------------------------------------------- *//* * Port Notes: *	Postgres makes the following assumption about machines: * *	sizeof(Datum) == sizeof(long) >= sizeof(void *) >= 4 * *	Postgres also assumes that * *	sizeof(char) == 1 * *	and that * *	sizeof(short) == 2 * * When a type narrower than Datum is stored in a Datum, we place it in the * low-order bits and are careful that the DatumGetXXX macro for it discards * the unused high-order bits (as opposed to, say, assuming they are zero). * This is needed to support old-style user-defined functions, since depending * on architecture and compiler, the return value of a function returning char * or short may contain garbage when called as if it returned Datum. */typedef unsigned long Datum;	/* XXX sizeof(long) >= sizeof(void *) *//* ---------------------------------------------------------------- *				Section 3:	exception handling definitions *							Assert, Trap, etc macros * ---------------------------------------------------------------- */extern PGDLLIMPORT bool assert_enabled;/* * USE_ASSERT_CHECKING, if defined, turns on all the assertions. * - plai  9/5/90 * * It should _NOT_ be defined in releases or in benchmark copies *//* * Trap *		Generates an exception if the given condition is true. */#define Trap(condition, errorType) \	do { \		if ((assert_enabled) && (condition)) \			ExceptionalCondition(CppAsString(condition), (errorType), \								 __FILE__, __LINE__); \	} while (0)/* *	TrapMacro is the same as Trap but it's intended for use in macros: * *		#define foo(x) (AssertMacro(x != 0) && bar(x)) * *	Isn't CPP fun? */#define TrapMacro(condition, errorType) \	((bool) ((! assert_enabled) || ! (condition) || \			 (ExceptionalCondition(CppAsString(condition), (errorType), \								   __FILE__, __LINE__))))#ifndef USE_ASSERT_CHECKING#define Assert(condition)#define AssertMacro(condition)	((void)true)#define AssertArg(condition)#define AssertState(condition)#else#define Assert(condition) \		Trap(!(condition), "FailedAssertion")#define AssertMacro(condition) \		((void) TrapMacro(!(condition), "FailedAssertion"))#define AssertArg(condition) \		Trap(!(condition), "BadArgument")#define AssertState(condition) \		Trap(!(condition), "BadState")#endif   /* USE_ASSERT_CHECKING */extern int ExceptionalCondition(const char *conditionName,					 const char *errorType,					 const char *fileName, int lineNumber);/* ---------------------------------------------------------------- *				Section 4: genbki macros used by catalog/pg_xxx.h files * ---------------------------------------------------------------- */#define CATALOG(name,oid)	typedef struct CppConcat(FormData_,name)#define BKI_BOOTSTRAP#define BKI_SHARED_RELATION#define BKI_WITHOUT_OIDS/* these need to expand into some harmless, repeatable declaration */#define DATA(x)   extern int no_such_variable#define DESCR(x)  extern int no_such_variable#define SHDESCR(x) extern int no_such_variable#endif   /* POSTGRES_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -