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

📄 name.c

📁 postgresql8.3.4源码,开源数据库
💻 C
字号:
/*------------------------------------------------------------------------- * * name.c *	  Functions for the built-in type "name". * * name replaces char16 and is carefully implemented so that it * is a string of physical length NAMEDATALEN. * DO NOT use hard-coded constants anywhere * always use NAMEDATALEN as the symbolic constant!   - jolly 8/21/95 * * * 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/name.c,v 1.61 2008/01/01 19:45:52 momjian Exp $ * *------------------------------------------------------------------------- */#include "postgres.h"#include "catalog/namespace.h"#include "catalog/pg_type.h"#include "libpq/pqformat.h"#include "mb/pg_wchar.h"#include "miscadmin.h"#include "utils/array.h"#include "utils/builtins.h"#include "utils/lsyscache.h"/***************************************************************************** *	 USER I/O ROUTINES (none)												 * *****************************************************************************//* *		namein	- converts "..." to internal representation * *		Note: *				[Old] Currently if strlen(s) < NAMEDATALEN, the extra chars are nulls *				Now, always NULL terminated */Datumnamein(PG_FUNCTION_ARGS){	char	   *s = PG_GETARG_CSTRING(0);	NameData   *result;	int			len;	len = strlen(s);	len = pg_mbcliplen(s, len, NAMEDATALEN - 1);	result = (NameData *) palloc0(NAMEDATALEN);	memcpy(NameStr(*result), s, len);	PG_RETURN_NAME(result);}/* *		nameout - converts internal representation to "..." */Datumnameout(PG_FUNCTION_ARGS){	Name		s = PG_GETARG_NAME(0);	PG_RETURN_CSTRING(pstrdup(NameStr(*s)));}/* *		namerecv			- converts external binary format to name */Datumnamerecv(PG_FUNCTION_ARGS){	StringInfo	buf = (StringInfo) PG_GETARG_POINTER(0);	Name		result;	char	   *str;	int			nbytes;	str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes);	if (nbytes >= NAMEDATALEN)		ereport(ERROR,				(errcode(ERRCODE_NAME_TOO_LONG),				 errmsg("identifier too long"),				 errdetail("Identifier must be less than %d characters.",						   NAMEDATALEN)));	result = (NameData *) palloc0(NAMEDATALEN);	memcpy(result, str, nbytes);	pfree(str);	PG_RETURN_NAME(result);}/* *		namesend			- converts name to binary format */Datumnamesend(PG_FUNCTION_ARGS){	Name		s = PG_GETARG_NAME(0);	StringInfoData buf;	pq_begintypsend(&buf);	pq_sendtext(&buf, NameStr(*s), strlen(NameStr(*s)));	PG_RETURN_BYTEA_P(pq_endtypsend(&buf));}/***************************************************************************** *	 PUBLIC ROUTINES														 * *****************************************************************************//* *		nameeq	- returns 1 iff arguments are equal *		namene	- returns 1 iff arguments are not equal * *		BUGS: *				Assumes that "xy\0\0a" should be equal to "xy\0b". *				If not, can do the comparison backwards for efficiency. * *		namelt	- returns 1 iff a < b *		namele	- returns 1 iff a <= b *		namegt	- returns 1 iff a > b *		namege	- returns 1 iff a >= b * */Datumnameeq(PG_FUNCTION_ARGS){	Name		arg1 = PG_GETARG_NAME(0);	Name		arg2 = PG_GETARG_NAME(1);	PG_RETURN_BOOL(strncmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN) == 0);}Datumnamene(PG_FUNCTION_ARGS){	Name		arg1 = PG_GETARG_NAME(0);	Name		arg2 = PG_GETARG_NAME(1);	PG_RETURN_BOOL(strncmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN) != 0);}Datumnamelt(PG_FUNCTION_ARGS){	Name		arg1 = PG_GETARG_NAME(0);	Name		arg2 = PG_GETARG_NAME(1);	PG_RETURN_BOOL(strncmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN) < 0);}Datumnamele(PG_FUNCTION_ARGS){	Name		arg1 = PG_GETARG_NAME(0);	Name		arg2 = PG_GETARG_NAME(1);	PG_RETURN_BOOL(strncmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN) <= 0);}Datumnamegt(PG_FUNCTION_ARGS){	Name		arg1 = PG_GETARG_NAME(0);	Name		arg2 = PG_GETARG_NAME(1);	PG_RETURN_BOOL(strncmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN) > 0);}Datumnamege(PG_FUNCTION_ARGS){	Name		arg1 = PG_GETARG_NAME(0);	Name		arg2 = PG_GETARG_NAME(1);	PG_RETURN_BOOL(strncmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN) >= 0);}/* * comparison routines for LIKE indexing support */Datumname_pattern_eq(PG_FUNCTION_ARGS){	Name		arg1 = PG_GETARG_NAME(0);	Name		arg2 = PG_GETARG_NAME(1);	PG_RETURN_BOOL(memcmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN) == 0);}Datumname_pattern_ne(PG_FUNCTION_ARGS){	Name		arg1 = PG_GETARG_NAME(0);	Name		arg2 = PG_GETARG_NAME(1);	PG_RETURN_BOOL(memcmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN) != 0);}Datumname_pattern_lt(PG_FUNCTION_ARGS){	Name		arg1 = PG_GETARG_NAME(0);	Name		arg2 = PG_GETARG_NAME(1);	PG_RETURN_BOOL(memcmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN) < 0);}Datumname_pattern_le(PG_FUNCTION_ARGS){	Name		arg1 = PG_GETARG_NAME(0);	Name		arg2 = PG_GETARG_NAME(1);	PG_RETURN_BOOL(memcmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN) <= 0);}Datumname_pattern_gt(PG_FUNCTION_ARGS){	Name		arg1 = PG_GETARG_NAME(0);	Name		arg2 = PG_GETARG_NAME(1);	PG_RETURN_BOOL(memcmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN) > 0);}Datumname_pattern_ge(PG_FUNCTION_ARGS){	Name		arg1 = PG_GETARG_NAME(0);	Name		arg2 = PG_GETARG_NAME(1);	PG_RETURN_BOOL(memcmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN) >= 0);}/* (see char.c for comparison/operation routines) */intnamecpy(Name n1, Name n2){	if (!n1 || !n2)		return -1;	strncpy(NameStr(*n1), NameStr(*n2), NAMEDATALEN);	return 0;}#ifdef NOT_USEDintnamecat(Name n1, Name n2){	return namestrcat(n1, NameStr(*n2));		/* n2 can't be any longer than												 * n1 */}#endif#ifdef NOT_USEDintnamecmp(Name n1, Name n2){	return strncmp(NameStr(*n1), NameStr(*n2), NAMEDATALEN);}#endifintnamestrcpy(Name name, const char *str){	if (!name || !str)		return -1;	StrNCpy(NameStr(*name), str, NAMEDATALEN);	return 0;}#ifdef NOT_USEDintnamestrcat(Name name, const char *str){	int			i;	char	   *p,			   *q;	if (!name || !str)		return -1;	for (i = 0, p = NameStr(*name); i < NAMEDATALEN && *p; ++i, ++p)		;	for (q = str; i < NAMEDATALEN; ++i, ++p, ++q)	{		*p = *q;		if (!*q)			break;	}	return 0;}#endifintnamestrcmp(Name name, const char *str){	if (!name && !str)		return 0;	if (!name)		return -1;				/* NULL < anything */	if (!str)		return 1;				/* NULL < anything */	return strncmp(NameStr(*name), str, NAMEDATALEN);}/* * SQL-functions CURRENT_USER, SESSION_USER */Datumcurrent_user(PG_FUNCTION_ARGS){	PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(GetUserNameFromId(GetUserId()))));}Datumsession_user(PG_FUNCTION_ARGS){	PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(GetUserNameFromId(GetSessionUserId()))));}/* * SQL-functions CURRENT_SCHEMA, CURRENT_SCHEMAS */Datumcurrent_schema(PG_FUNCTION_ARGS){	List	   *search_path = fetch_search_path(false);	char	   *nspname;	if (search_path == NIL)		PG_RETURN_NULL();	nspname = get_namespace_name(linitial_oid(search_path));	list_free(search_path);	if (!nspname)		PG_RETURN_NULL();		/* recently-deleted namespace? */	PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(nspname)));}Datumcurrent_schemas(PG_FUNCTION_ARGS){	List	   *search_path = fetch_search_path(PG_GETARG_BOOL(0));	ListCell   *l;	Datum	   *names;	int			i;	ArrayType  *array;	names = (Datum *) palloc(list_length(search_path) * sizeof(Datum));	i = 0;	foreach(l, search_path)	{		char	   *nspname;		nspname = get_namespace_name(lfirst_oid(l));		if (nspname)			/* watch out for deleted namespace */		{			names[i] = DirectFunctionCall1(namein, CStringGetDatum(nspname));			i++;		}	}	list_free(search_path);	array = construct_array(names, i,							NAMEOID,							NAMEDATALEN,		/* sizeof(Name) */							false,		/* Name is not by-val */							'i');		/* alignment of Name */	PG_RETURN_POINTER(array);}

⌨️ 快捷键说明

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