1 /*-------------------------------------------------------------------------
4 * Functions for the built-in type "name".
5 * name replaces char16 and is carefully implemented so that it
6 * is a string of length NAMEDATALEN. DO NOT use hard-coded constants anywhere
7 * always use NAMEDATALEN as the symbolic constant! - jolly 8/21/95
10 * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
11 * Portions Copyright (c) 1994, Regents of the University of California
15 * $Header: /cvsroot/pgsql/src/backend/utils/adt/name.c,v 1.32 2001/10/25 05:49:45 momjian Exp $
17 *-------------------------------------------------------------------------
21 #include "miscadmin.h"
22 #include "utils/builtins.h"
24 /*****************************************************************************
25 * USER I/O ROUTINES (none) *
26 *****************************************************************************/
30 * namein - converts "..." to internal representation
33 * [Old] Currently if strlen(s) < NAMEDATALEN, the extra chars are nulls
34 * Now, always NULL terminated
37 namein(PG_FUNCTION_ARGS)
39 char *s = PG_GETARG_CSTRING(0);
43 result = (NameData *) palloc(NAMEDATALEN);
44 /* always keep it null-padded */
45 StrNCpy(NameStr(*result), s, NAMEDATALEN);
46 len = strlen(NameStr(*result));
47 while (len < NAMEDATALEN)
49 *(NameStr(*result) + len) = '\0';
52 PG_RETURN_NAME(result);
56 * nameout - converts internal representation to "..."
59 nameout(PG_FUNCTION_ARGS)
61 Name s = PG_GETARG_NAME(0);
63 PG_RETURN_CSTRING(pstrdup(NameStr(*s)));
67 /*****************************************************************************
69 *****************************************************************************/
72 * nameeq - returns 1 iff arguments are equal
73 * namene - returns 1 iff arguments are not equal
76 * Assumes that "xy\0\0a" should be equal to "xy\0b".
77 * If not, can do the comparison backwards for efficiency.
79 * namelt - returns 1 iff a < b
80 * namele - returns 1 iff a <= b
81 * namegt - returns 1 iff a < b
82 * namege - returns 1 iff a <= b
86 nameeq(PG_FUNCTION_ARGS)
88 Name arg1 = PG_GETARG_NAME(0);
89 Name arg2 = PG_GETARG_NAME(1);
91 PG_RETURN_BOOL(strncmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN) == 0);
95 namene(PG_FUNCTION_ARGS)
97 Name arg1 = PG_GETARG_NAME(0);
98 Name arg2 = PG_GETARG_NAME(1);
100 PG_RETURN_BOOL(strncmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN) != 0);
104 namelt(PG_FUNCTION_ARGS)
106 Name arg1 = PG_GETARG_NAME(0);
107 Name arg2 = PG_GETARG_NAME(1);
109 PG_RETURN_BOOL(strncmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN) < 0);
113 namele(PG_FUNCTION_ARGS)
115 Name arg1 = PG_GETARG_NAME(0);
116 Name arg2 = PG_GETARG_NAME(1);
118 PG_RETURN_BOOL(strncmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN) <= 0);
122 namegt(PG_FUNCTION_ARGS)
124 Name arg1 = PG_GETARG_NAME(0);
125 Name arg2 = PG_GETARG_NAME(1);
127 PG_RETURN_BOOL(strncmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN) > 0);
131 namege(PG_FUNCTION_ARGS)
133 Name arg1 = PG_GETARG_NAME(0);
134 Name arg2 = PG_GETARG_NAME(1);
136 PG_RETURN_BOOL(strncmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN) >= 0);
140 /* (see char.c for comparison/operation routines) */
143 namecpy(Name n1, Name n2)
147 strncpy(NameStr(*n1), NameStr(*n2), NAMEDATALEN);
153 namecat(Name n1, Name n2)
155 return namestrcat(n1, NameStr(*n2)); /* n2 can't be any longer
162 namecmp(Name n1, Name n2)
164 return strncmp(NameStr(*n1), NameStr(*n2), NAMEDATALEN);
169 namestrcpy(Name name, const char *str)
173 StrNCpy(NameStr(*name), str, NAMEDATALEN);
179 namestrcat(Name name, const char *str)
187 for (i = 0, p = NameStr(*name); i < NAMEDATALEN && *p; ++i, ++p)
189 for (q = str; i < NAMEDATALEN; ++i, ++p, ++q)
200 namestrcmp(Name name, const char *str)
205 return -1; /* NULL < anything */
207 return 1; /* NULL < anything */
208 return strncmp(NameStr(*name), str, NAMEDATALEN);
212 /* SQL-functions CURRENT_USER and SESSION_USER */
214 current_user(PG_FUNCTION_ARGS)
216 PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(GetUserName(GetUserId()))));
220 session_user(PG_FUNCTION_ARGS)
222 PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(GetUserName(GetSessionUserId()))));
226 /*****************************************************************************
228 *****************************************************************************/
232 NameComputeLength(Name name)
237 for (length = 0, charP = NameStr(*name);
238 length < NAMEDATALEN && *charP != '\0';
241 return (uint32) length;