mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-30 00:04:49 -04:00 
			
		
		
		
	contrib/isn updates from Jeremy Kronuz.
This commit is contained in:
		
							parent
							
								
									f5b4d9a9e0
								
							
						
					
					
						commit
						5e08e49637
					
				| @ -1,6 +1,6 @@ | |||||||
| 
 | 
 | ||||||
| EAN13 - UPC - ISBN (books) - ISMN (music) - ISSN (serials) | -- EAN13 - UPC - ISBN (books) - ISMN (music) - ISSN (serials) | ||||||
| ---------------------------------------------------------- | ------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| Copyright Germán Méndez Bravo (Kronuz), 2004 - 2006 | Copyright Germán Méndez Bravo (Kronuz), 2004 - 2006 | ||||||
| This module is released under the same BSD license as the rest of PostgreSQL. | This module is released under the same BSD license as the rest of PostgreSQL. | ||||||
| @ -24,7 +24,7 @@ THIS MODULE IS PROVIDED "AS IS" AND WITHOUT ANY WARRANTY | |||||||
|         OF ANY KIND, EXPRESS OR IMPLIED. |         OF ANY KIND, EXPRESS OR IMPLIED. | ||||||
| !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||||||
| 
 | 
 | ||||||
| Content of the Module | -- Content of the Module | ||||||
| ------------------------------------------------- | ------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| This directory contains definitions for a few PostgreSQL | This directory contains definitions for a few PostgreSQL | ||||||
| @ -143,7 +143,7 @@ On success: | |||||||
| 
 | 
 | ||||||
| (on failure, the functions 'ereport' the error) | (on failure, the functions 'ereport' the error) | ||||||
| 
 | 
 | ||||||
| Testing/Playing Functions | -- Testing/Playing Functions | ||||||
| ------------------------------------------------- | ------------------------------------------------- | ||||||
| isn_weak(boolean) - Sets the weak input mode.  | isn_weak(boolean) - Sets the weak input mode.  | ||||||
| This function is intended for testing use only! | This function is intended for testing use only! | ||||||
| @ -173,7 +173,7 @@ To work with invalid numbers, you can use two functions: | |||||||
|   + make_valid(), which validates an invalid number (deleting the invalid flag) |   + make_valid(), which validates an invalid number (deleting the invalid flag) | ||||||
|   + is_valid(), which checks for the invalid flag presence. |   + is_valid(), which checks for the invalid flag presence. | ||||||
| 
 | 
 | ||||||
| Examples of Use | -- Examples of Use | ||||||
| ------------------------------------------------- | ------------------------------------------------- | ||||||
| --Using the types directly: | --Using the types directly: | ||||||
| 	select isbn('978-0-393-04002-9'); | 	select isbn('978-0-393-04002-9'); | ||||||
| @ -181,8 +181,11 @@ Examples of Use | |||||||
| 	select issn('1436-4522'); | 	select issn('1436-4522'); | ||||||
| 
 | 
 | ||||||
| --Casting types: | --Casting types: | ||||||
| -- note that you can't cast from ean13 to other type, thus the following | -- note that you can only cast from ean13 to other type when the casted  | ||||||
| -- will NOT work: select upc(ean13('0220356483481')); | -- number would be valid in the realm of the casted type;  | ||||||
|  | -- thus, the following will NOT work: select isbn(ean13('0220356483481'));  | ||||||
|  | -- but these will:  | ||||||
|  |     select upc(ean13('0220356483481'));  | ||||||
|     select ean13(upc('220356483481'));  |     select ean13(upc('220356483481'));  | ||||||
| 
 | 
 | ||||||
| --Create a table with a single column to hold ISBN numbers: | --Create a table with a single column to hold ISBN numbers: | ||||||
| @ -210,7 +213,7 @@ Examples of Use | |||||||
| 
 | 
 | ||||||
|   select isbn13(id) from test; |   select isbn13(id) from test; | ||||||
| 
 | 
 | ||||||
| Contact | -- Contact | ||||||
| ------------------------------------------------- | ------------------------------------------------- | ||||||
| Please suggestions or bug reports to kronuz at users.sourceforge.net | Please suggestions or bug reports to kronuz at users.sourceforge.net | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -7,7 +7,7 @@ | |||||||
|  * Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group |  * Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group | ||||||
|  * |  * | ||||||
|  * IDENTIFICATION |  * IDENTIFICATION | ||||||
|  *	  $PostgreSQL: pgsql/contrib/isn/isn.c,v 1.1 2006/09/09 04:07:52 tgl Exp $ |  *	  $PostgreSQL: pgsql/contrib/isn/isn.c,v 1.2 2006/09/10 20:45:17 tgl Exp $ | ||||||
|  * |  * | ||||||
|  *------------------------------------------------------------------------- |  *------------------------------------------------------------------------- | ||||||
|  */ |  */ | ||||||
| @ -31,7 +31,7 @@ PG_MODULE_MAGIC; | |||||||
| 
 | 
 | ||||||
| enum isn_type { INVALID, ANY, EAN13, ISBN, ISMN, ISSN, UPC }; | enum isn_type { INVALID, ANY, EAN13, ISBN, ISMN, ISSN, UPC }; | ||||||
| 
 | 
 | ||||||
| static const char *isn_names[] = { "ISN", "ISN", "EAN13", "ISBN", "ISMN", "ISSN", "UPC" }; | static const char *isn_names[] = { "EAN13/UPC/ISxN", "EAN13/UPC/ISxN", "EAN13", "ISBN", "ISMN", "ISSN", "UPC" }; | ||||||
| 
 | 
 | ||||||
| static bool g_weak = false; | static bool g_weak = false; | ||||||
| static bool g_initialized = false; | static bool g_initialized = false; | ||||||
| @ -43,11 +43,11 @@ static bool g_initialized = false; | |||||||
| 
 | 
 | ||||||
| /***********************************************************************
 | /***********************************************************************
 | ||||||
|  ** |  ** | ||||||
|  **		Routines for ISNs. |  **		Routines for EAN13/UPC/ISxNs. | ||||||
|  ** |  ** | ||||||
|  ** Note: |  ** Note: | ||||||
|  **  In this code, a normalized string is one that is known to be a valid  |  **  In this code, a normalized string is one that is known to be a valid  | ||||||
|  **  ISN number containing only digits and hyphens and with enough space  |  **  ISxN number containing only digits and hyphens and with enough space  | ||||||
|  **  to hold the full 13 digits plus the maximum of four hyphens. |  **  to hold the full 13 digits plus the maximum of four hyphens. | ||||||
|  ***********************************************************************/ |  ***********************************************************************/ | ||||||
| 
 | 
 | ||||||
| @ -217,7 +217,7 @@ unsigned hyphenate(char *bufO, char *bufI, const char *(*TABLE)[2], const unsign | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * weight_checkdig -- Receives a buffer with a normalized ISN string number,  |  * weight_checkdig -- Receives a buffer with a normalized ISxN string number,  | ||||||
|  *                     and the length to weight. |  *                     and the length to weight. | ||||||
|  * |  * | ||||||
|  * Returns the weight of the number (the check digit value, 0-10) |  * Returns the weight of the number (the check digit value, 0-10) | ||||||
| @ -239,7 +239,7 @@ unsigned weight_checkdig(char *isn, unsigned size) | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * checkdig --- Receives a buffer with a normalized ISN string number,  |  * checkdig --- Receives a buffer with a normalized ISxN string number,  | ||||||
|  *               and the length to check. |  *               and the length to check. | ||||||
|  * |  * | ||||||
|  * Returns the check digit value (0-9) |  * Returns the check digit value (0-9) | ||||||
| @ -267,8 +267,94 @@ unsigned checkdig(char *num, unsigned size) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * ean2isn --- Convert in-place a normalized EAN13 string to the corresponding  |  * ean2isn --- Try to convert an ean13 number to a UPC/ISxN number. | ||||||
|  *            ISN string number. Assumes the input string is normalized. |  *             This doesn't verify for a valid check digit. | ||||||
|  |  * | ||||||
|  |  * If errorOK is false, ereport a useful error message if the ean13 is bad. | ||||||
|  |  * If errorOK is true, just return "false" for bad input. | ||||||
|  |  */ | ||||||
|  | static | ||||||
|  | bool ean2isn(ean13 ean, bool errorOK, ean13 *result, enum isn_type accept) | ||||||
|  | { | ||||||
|  | 	enum isn_type type = INVALID; | ||||||
|  | 
 | ||||||
|  | 	char buf[MAXEAN13LEN + 1]; | ||||||
|  | 	char *firstdig, *aux; | ||||||
|  | 	unsigned digval; | ||||||
|  | 	unsigned search; | ||||||
|  | 	ean13 ret = ean; | ||||||
|  | 	 | ||||||
|  | 	ean >>= 1; | ||||||
|  | 	/* verify it's in the EAN13 range */ | ||||||
|  | 	if(ean > UINT64CONST(9999999999999)) | ||||||
|  | 		goto eantoobig; | ||||||
|  | 
 | ||||||
|  | 	/* convert the number */ | ||||||
|  | 	search = 0; | ||||||
|  | 	firstdig = aux = buf + 13; | ||||||
|  | 	*aux = '\0';	    /* terminate string; aux points to last digit */ | ||||||
|  | 	do { | ||||||
|  | 	    digval = (unsigned)(ean % 10);		/* get the decimal value */  | ||||||
|  | 	    ean /= 10;												/* get next digit */ | ||||||
|  | 		*--aux = (char)(digval + '0');			/* convert to ascii and store */ | ||||||
|  | 	} while(ean && search++<12); | ||||||
|  | 	while(search++<12) *--aux = '0';			/* fill the remaining EAN13 with '0' */ | ||||||
|  | 	 | ||||||
|  | 	/* find out the data type: */ | ||||||
|  | 	if(!strncmp("978", buf, 3)) { /* ISBN */ | ||||||
|  | 		type = ISBN; | ||||||
|  | 	} else if(!strncmp("977", buf, 3)) { /* ISSN */ | ||||||
|  | 		type = ISSN; | ||||||
|  | 	} else if(!strncmp("9790", buf, 4)) { /* ISMN */ | ||||||
|  | 		type = ISMN; | ||||||
|  | 	} else if(!strncmp("979", buf, 3)) { /* ISBN-13 */ | ||||||
|  | 		type = ISBN; | ||||||
|  | 	} else if(*buf == '0') { /* UPC */ | ||||||
|  | 		type = UPC; | ||||||
|  | 	} else { | ||||||
|  | 		type = EAN13; | ||||||
|  | 	} | ||||||
|  | 	if(accept != ANY && accept != EAN13 && accept != type) goto eanwrongtype; | ||||||
|  | 
 | ||||||
|  | 	*result = ret; | ||||||
|  | 	return true; | ||||||
|  | 	 | ||||||
|  | eanwrongtype: | ||||||
|  | 	if(!errorOK) { | ||||||
|  | 		if(type!=EAN13) { | ||||||
|  | 			ereport(ERROR, | ||||||
|  | 				(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), | ||||||
|  | 				 errmsg("cannot cast EAN13(%s) to %s for number: \"%s\"", | ||||||
|  | 						isn_names[type], isn_names[accept], buf))); | ||||||
|  | 		} else { | ||||||
|  | 			ereport(ERROR, | ||||||
|  | 				(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), | ||||||
|  | 				 errmsg("cannot cast %s to %s for number: \"%s\"", | ||||||
|  | 						isn_names[type], isn_names[accept], buf))); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return false; | ||||||
|  | 
 | ||||||
|  | eantoobig: | ||||||
|  | 	if(!errorOK) { | ||||||
|  | 		char	eanbuf[64]; | ||||||
|  | 
 | ||||||
|  | 		/*
 | ||||||
|  | 		 * Format the number separately to keep the machine-dependent | ||||||
|  | 		 * format code out of the translatable message text | ||||||
|  | 		 */ | ||||||
|  | 		snprintf(eanbuf, sizeof(eanbuf), EAN13_FORMAT, ean); | ||||||
|  | 		ereport(ERROR, | ||||||
|  | 				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), | ||||||
|  | 				 errmsg("value \"%s\" is out of range for %s type", | ||||||
|  | 						eanbuf, isn_names[type]))); | ||||||
|  | 	} | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * ean2UPC/ISxN --- Convert in-place a normalized EAN13 string to the corresponding  | ||||||
|  |  *                  UPC/ISxN string number. Assumes the input string is normalized. | ||||||
|  */ |  */ | ||||||
| static inline | static inline | ||||||
| void ean2ISBN(char *isn) | void ean2ISBN(char *isn) | ||||||
| @ -325,7 +411,8 @@ ean13 str2ean(const char *num) | |||||||
| { | { | ||||||
| 	ean13 ean = 0;	/* current ean */ | 	ean13 ean = 0;	/* current ean */ | ||||||
| 	while(*num) { | 	while(*num) { | ||||||
| 		ean = 10 * ean + ((*num++) - '0'); | 		if(isdigit(*num)) ean = 10 * ean + (*num - '0'); | ||||||
|  | 		num++; | ||||||
| 	} | 	} | ||||||
|     return (ean<<1); /* also give room to a flag */ |     return (ean<<1); /* also give room to a flag */ | ||||||
| } | } | ||||||
| @ -336,7 +423,7 @@ ean13 str2ean(const char *num) | |||||||
|  *                the string (maximum MAXEAN13LEN+1 bytes) |  *                the string (maximum MAXEAN13LEN+1 bytes) | ||||||
|  *                This doesn't verify for a valid check digit. |  *                This doesn't verify for a valid check digit. | ||||||
|  * |  * | ||||||
|  * If shortType is true, the returned string is in the old ISN short format. |  * If shortType is true, the returned string is in the old ISxN short format. | ||||||
|  * If errorOK is false, ereport a useful error message if the string is bad. |  * If errorOK is false, ereport a useful error message if the string is bad. | ||||||
|  * If errorOK is true, just return "false" for bad input. |  * If errorOK is true, just return "false" for bad input. | ||||||
|  */ |  */ | ||||||
| @ -369,8 +456,8 @@ bool ean2string(ean13 ean, bool errorOK, char *result, bool shortType) | |||||||
| 	    digval = (unsigned)(ean % 10);		/* get the decimal value */  | 	    digval = (unsigned)(ean % 10);		/* get the decimal value */  | ||||||
| 	    ean /= 10;												/* get next digit */ | 	    ean /= 10;												/* get next digit */ | ||||||
| 		*--aux = (char)(digval + '0');			/* convert to ascii and store */ | 		*--aux = (char)(digval + '0');			/* convert to ascii and store */ | ||||||
| 		if(++search == 1) *--aux = '-';			/* the check digit is always there */ | 		if(search == 0) *--aux = '-';			/* the check digit is always there */ | ||||||
| 	} while(ean); | 	} while(ean && search++<13); | ||||||
| 	while(search++<13) *--aux = '0';			/* fill the remaining EAN13 with '0' */ | 	while(search++<13) *--aux = '0';			/* fill the remaining EAN13 with '0' */ | ||||||
| 
 | 
 | ||||||
| 	/* The string should be in this form: ???DDDDDDDDDDDD-D" */ | 	/* The string should be in this form: ???DDDDDDDDDDDD-D" */ | ||||||
| @ -409,7 +496,7 @@ bool ean2string(ean13 ean, bool errorOK, char *result, bool shortType) | |||||||
| 		TABLE_index = NULL; | 		TABLE_index = NULL; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/* verify it's a logically valid EAN13/ISN */ | 	/* verify it's a logically valid EAN13/UPC/ISxN */ | ||||||
| 	digval = search; | 	digval = search; | ||||||
| 	search = hyphenate(result+digval, result+digval+2, TABLE, TABLE_index); | 	search = hyphenate(result+digval, result+digval+2, TABLE, TABLE_index); | ||||||
| 
 | 
 | ||||||
| @ -452,8 +539,8 @@ eantoobig: | |||||||
| 		snprintf(eanbuf, sizeof(eanbuf), EAN13_FORMAT, ean); | 		snprintf(eanbuf, sizeof(eanbuf), EAN13_FORMAT, ean); | ||||||
| 		ereport(ERROR, | 		ereport(ERROR, | ||||||
| 				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), | 				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), | ||||||
| 				 errmsg("value \"%s\" is out of range for ISN type", | 				 errmsg("value \"%s\" is out of range for %s type", | ||||||
| 						eanbuf))); | 						eanbuf, isn_names[type]))); | ||||||
| 	} | 	} | ||||||
| 	return false; | 	return false; | ||||||
| } | } | ||||||
| @ -483,7 +570,7 @@ bool string2ean(const char *str, bool errorOK, ean13 *result, | |||||||
| 	/* recognize and validate the number: */ | 	/* recognize and validate the number: */ | ||||||
| 	while(*aux2 && length <= 13) { | 	while(*aux2 && length <= 13) { | ||||||
| 		last = (*(aux2+1) == '!' || *(aux2+1) == '\0'); /* is the last character */ | 		last = (*(aux2+1) == '!' || *(aux2+1) == '\0'); /* is the last character */ | ||||||
| 		digit = isdigit(*aux2); /* is current character a digit? */ | 		digit = (isdigit(*aux2)!=0); /* is current character a digit? */ | ||||||
| 		if(*aux2=='?' && last) /* automagically calculate check digit if it's '?' */ | 		if(*aux2=='?' && last) /* automagically calculate check digit if it's '?' */ | ||||||
| 			magic = digit = true; | 			magic = digit = true; | ||||||
| 		if(length == 0 &&  (*aux2=='M' || *aux2=='m')) { | 		if(length == 0 &&  (*aux2=='M' || *aux2=='m')) { | ||||||
| @ -583,19 +670,25 @@ bool string2ean(const char *str, bool errorOK, ean13 *result, | |||||||
| 			break; | 			break; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if(!valid && !magic) goto eanbadcheck; |   /* fix the check digit: */ | ||||||
| 			 |  | ||||||
| 	for(aux1 = buf; *aux1 && *aux1 <= ' '; aux1++); | 	for(aux1 = buf; *aux1 && *aux1 <= ' '; aux1++); | ||||||
| 	aux1[12] = checkdig(aux1, 13) + '0'; | 	aux1[12] = checkdig(aux1, 13) + '0'; | ||||||
| 	aux1[13] = '\0'; | 	aux1[13] = '\0'; | ||||||
| 	 | 	 | ||||||
|  | 	if(!valid && !magic) goto eanbadcheck; | ||||||
|  | 
 | ||||||
| 	*result = str2ean(aux1); | 	*result = str2ean(aux1); | ||||||
| 	*result |= valid?0:1; | 	*result |= valid?0:1; | ||||||
| 
 |  | ||||||
| 	return true; | 	return true; | ||||||
| 
 | 
 | ||||||
| eanbadcheck:  | eanbadcheck:  | ||||||
| 	if(!g_weak) { | 	if(g_weak) { /* weak input mode is activated: */ | ||||||
|  | 	  /* set the "invalid-check-digit-on-input" flag */  | ||||||
|  | 		*result = str2ean(aux1); | ||||||
|  | 		*result |= 1; | ||||||
|  | 	return true; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 		if(!errorOK) { | 		if(!errorOK) { | ||||||
| 			if(rcheck == (unsigned)-1) { | 			if(rcheck == (unsigned)-1) { | ||||||
| 				ereport(ERROR, | 				ereport(ERROR, | ||||||
| @ -610,30 +703,6 @@ eanbadcheck: | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		return false; | 		return false; | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if(accept != EAN13 && accept != ANY && type != accept) goto eanwrongtype; |  | ||||||
| 
 |  | ||||||
| 	/* fix the check digit: */ |  | ||||||
| 	for(aux1 = buf; *aux1 && *aux1 <= ' '; aux1++); |  | ||||||
| 	aux1[12] = checkdig(aux1, 13) + '0'; |  | ||||||
| 	aux1[13] = '\0'; |  | ||||||
| 	*result = str2ean(aux1); |  | ||||||
| 
 |  | ||||||
| 	 /* set the "invalid-check-digit-on-input" flag */  |  | ||||||
| 	*result |= 1; |  | ||||||
| 
 |  | ||||||
| 	/* just warn about the error when there was a real check digit error: */ |  | ||||||
| 	if(check != rcheck) { |  | ||||||
| 		if(rcheck == (unsigned)-1) { |  | ||||||
| 			elog(WARNING, "invalid %s number: \"%s\"", |  | ||||||
| 				isn_names[accept], str); |  | ||||||
| 		} else { |  | ||||||
| 			elog(WARNING, "invalid check digit for %s number: \"%s\", should be %c", |  | ||||||
| 				isn_names[accept], str, (rcheck==10)?('X'):(rcheck+'0')); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return true; |  | ||||||
| 
 | 
 | ||||||
| eaninvalid: | eaninvalid: | ||||||
| 	if(!errorOK) | 	if(!errorOK) | ||||||
| @ -647,8 +716,8 @@ eanwrongtype: | |||||||
| 	if(!errorOK) | 	if(!errorOK) | ||||||
| 		ereport(ERROR, | 		ereport(ERROR, | ||||||
| 				(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), | 				(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), | ||||||
| 				 errmsg("invalid %s type for number: \"%s\"", | 				 errmsg("cannot cast %s to %s for number: \"%s\"", | ||||||
| 						isn_names[accept], str))); | 						isn_names[type], isn_names[accept], str))); | ||||||
| 	return false; | 	return false; | ||||||
| 
 | 
 | ||||||
| eantoobig: | eantoobig: | ||||||
| @ -804,6 +873,55 @@ isn_cast_to_text(PG_FUNCTION_ARGS) | |||||||
|     PG_RETURN_TEXT_P(GET_TEXT(buf)); |     PG_RETURN_TEXT_P(GET_TEXT(buf)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | PG_FUNCTION_INFO_V1(isbn_cast_from_ean13); | ||||||
|  | Datum | ||||||
|  | isbn_cast_from_ean13(PG_FUNCTION_ARGS) | ||||||
|  | { | ||||||
|  | 	ean13		val = PG_GETARG_EAN13(0); | ||||||
|  | 	ean13		result; | ||||||
|  | 
 | ||||||
|  | 	(void) ean2isn(val, false, &result, ISBN); | ||||||
|  | 
 | ||||||
|  | 	PG_RETURN_EAN13(result); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | PG_FUNCTION_INFO_V1(ismn_cast_from_ean13); | ||||||
|  | Datum | ||||||
|  | ismn_cast_from_ean13(PG_FUNCTION_ARGS) | ||||||
|  | { | ||||||
|  | 	ean13		val = PG_GETARG_EAN13(0); | ||||||
|  | 	ean13		result; | ||||||
|  | 
 | ||||||
|  | 	(void) ean2isn(val, false, &result, ISMN); | ||||||
|  | 
 | ||||||
|  | 	PG_RETURN_EAN13(result); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | PG_FUNCTION_INFO_V1(issn_cast_from_ean13); | ||||||
|  | Datum | ||||||
|  | issn_cast_from_ean13(PG_FUNCTION_ARGS) | ||||||
|  | { | ||||||
|  | 	ean13		val = PG_GETARG_EAN13(0); | ||||||
|  | 	ean13		result; | ||||||
|  | 
 | ||||||
|  | 	(void) ean2isn(val, false, &result, ISSN); | ||||||
|  | 
 | ||||||
|  | 	PG_RETURN_EAN13(result); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | PG_FUNCTION_INFO_V1(upc_cast_from_ean13); | ||||||
|  | Datum | ||||||
|  | upc_cast_from_ean13(PG_FUNCTION_ARGS) | ||||||
|  | { | ||||||
|  | 	ean13		val = PG_GETARG_EAN13(0); | ||||||
|  | 	ean13		result; | ||||||
|  | 
 | ||||||
|  | 	(void) ean2isn(val, false, &result, UPC); | ||||||
|  | 
 | ||||||
|  | 	PG_RETURN_EAN13(result); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| PG_FUNCTION_INFO_V1(ean13_cast_from_text); | PG_FUNCTION_INFO_V1(ean13_cast_from_text); | ||||||
| Datum | Datum | ||||||
| ean13_cast_from_text(PG_FUNCTION_ARGS) | ean13_cast_from_text(PG_FUNCTION_ARGS) | ||||||
|  | |||||||
| @ -7,7 +7,7 @@ | |||||||
|  * Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group |  * Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group | ||||||
|  * |  * | ||||||
|  * IDENTIFICATION |  * IDENTIFICATION | ||||||
|  *	  $PostgreSQL: pgsql/contrib/isn/isn.h,v 1.1 2006/09/09 04:07:52 tgl Exp $ |  *	  $PostgreSQL: pgsql/contrib/isn/isn.h,v 1.2 2006/09/10 20:45:17 tgl Exp $ | ||||||
|  * |  * | ||||||
|  *------------------------------------------------------------------------- |  *------------------------------------------------------------------------- | ||||||
|  */ |  */ | ||||||
| @ -27,8 +27,8 @@ typedef uint64 ean13; | |||||||
| 
 | 
 | ||||||
| #define EAN13_FORMAT UINT64_FORMAT | #define EAN13_FORMAT UINT64_FORMAT | ||||||
| 
 | 
 | ||||||
| #define PG_GETARG_EAN13(n) PG_GETARG_INT64(n) | #define PG_GETARG_EAN13(n) PG_GETARG_INT64((int64)n) | ||||||
| #define PG_RETURN_EAN13(x) PG_RETURN_INT64(x) | #define PG_RETURN_EAN13(x) PG_RETURN_INT64((int64)x) | ||||||
| 
 | 
 | ||||||
| extern Datum isn_out(PG_FUNCTION_ARGS); | extern Datum isn_out(PG_FUNCTION_ARGS); | ||||||
| extern Datum ean13_out(PG_FUNCTION_ARGS); | extern Datum ean13_out(PG_FUNCTION_ARGS); | ||||||
| @ -45,6 +45,10 @@ extern Datum isbn_cast_from_text(PG_FUNCTION_ARGS); | |||||||
| extern Datum ismn_cast_from_text(PG_FUNCTION_ARGS); | extern Datum ismn_cast_from_text(PG_FUNCTION_ARGS); | ||||||
| extern Datum issn_cast_from_text(PG_FUNCTION_ARGS); | extern Datum issn_cast_from_text(PG_FUNCTION_ARGS); | ||||||
| extern Datum upc_cast_from_text(PG_FUNCTION_ARGS); | extern Datum upc_cast_from_text(PG_FUNCTION_ARGS); | ||||||
|  | extern Datum isbn_cast_from_ean13(PG_FUNCTION_ARGS); | ||||||
|  | extern Datum ismn_cast_from_ean13(PG_FUNCTION_ARGS); | ||||||
|  | extern Datum issn_cast_from_ean13(PG_FUNCTION_ARGS); | ||||||
|  | extern Datum upc_cast_from_ean13(PG_FUNCTION_ARGS); | ||||||
| 
 | 
 | ||||||
| extern Datum is_valid(PG_FUNCTION_ARGS); | extern Datum is_valid(PG_FUNCTION_ARGS); | ||||||
| extern Datum make_valid(PG_FUNCTION_ARGS); | extern Datum make_valid(PG_FUNCTION_ARGS); | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| --	PostgreSQL code for ISNs (ISBN, ISMN, ISSN, EAN13, UPC) | --	PostgreSQL code for ISNs (ISBN, ISMN, ISSN, EAN13, UPC) | ||||||
| --  Copyright (c) 2004-2006, Germán Méndez Bravo (Kronuz) | --  Copyright (c) 2004-2006, Germán Méndez Bravo (Kronuz) | ||||||
| -- | -- | ||||||
| --	$PostgreSQL: pgsql/contrib/isn/isn.sql.in,v 1.1 2006/09/09 04:07:52 tgl Exp $ | --	$PostgreSQL: pgsql/contrib/isn/isn.sql.in,v 1.2 2006/09/10 20:45:17 tgl Exp $ | ||||||
| -- | -- | ||||||
| -- Example: | -- Example: | ||||||
| --   create table test ( id isbn ); | --   create table test ( id isbn ); | ||||||
| @ -2131,86 +2131,111 @@ CREATE OPERATOR CLASS upc_ops DEFAULT | |||||||
| -- Type casts: | -- Type casts: | ||||||
| -- | -- | ||||||
| --------------------------------------------------- | --------------------------------------------------- | ||||||
|  | CREATE FUNCTION isbn13(ean13) | ||||||
|  | RETURNS isbn13 | ||||||
|  | AS 'MODULE_PATHNAME', 'isbn_cast_from_ean13' | ||||||
|  | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
|  | CREATE FUNCTION ismn13(ean13) | ||||||
|  | RETURNS ismn13 | ||||||
|  | AS 'MODULE_PATHNAME', 'ismn_cast_from_ean13' | ||||||
|  | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
|  | CREATE FUNCTION issn13(ean13) | ||||||
|  | RETURNS issn13 | ||||||
|  | AS 'MODULE_PATHNAME', 'issn_cast_from_ean13' | ||||||
|  | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
|  | CREATE FUNCTION isbn(ean13) | ||||||
|  | RETURNS isbn | ||||||
|  | AS 'MODULE_PATHNAME', 'isbn_cast_from_ean13' | ||||||
|  | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
|  | CREATE FUNCTION ismn(ean13) | ||||||
|  | RETURNS ismn | ||||||
|  | AS 'MODULE_PATHNAME', 'ismn_cast_from_ean13' | ||||||
|  | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
|  | CREATE FUNCTION issn(ean13) | ||||||
|  | RETURNS issn | ||||||
|  | AS 'MODULE_PATHNAME', 'issn_cast_from_ean13' | ||||||
|  | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
|  | CREATE FUNCTION upc(ean13) | ||||||
|  | RETURNS upc | ||||||
|  | AS 'MODULE_PATHNAME', 'upc_cast_from_ean13' | ||||||
|  | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| CREATE FUNCTION ean13(text) | CREATE FUNCTION ean13(text) | ||||||
| RETURNS ean13 | RETURNS ean13 | ||||||
| AS 'MODULE_PATHNAME', 'ean13_cast_from_text' | AS 'MODULE_PATHNAME', 'ean13_cast_from_text' | ||||||
| LANGUAGE 'C' IMMUTABLE STRICT; | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
| 
 |  | ||||||
| CREATE FUNCTION isbn13(text) | CREATE FUNCTION isbn13(text) | ||||||
| RETURNS isbn13 | RETURNS isbn13 | ||||||
| AS 'MODULE_PATHNAME', 'isbn_cast_from_text' | AS 'MODULE_PATHNAME', 'isbn_cast_from_text' | ||||||
| LANGUAGE 'C' IMMUTABLE STRICT; | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
| 
 |  | ||||||
| CREATE FUNCTION ismn13(text) | CREATE FUNCTION ismn13(text) | ||||||
| RETURNS ismn13 | RETURNS ismn13 | ||||||
| AS 'MODULE_PATHNAME', 'ismn_cast_from_text' | AS 'MODULE_PATHNAME', 'ismn_cast_from_text' | ||||||
| LANGUAGE 'C' IMMUTABLE STRICT; | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
| 
 |  | ||||||
| CREATE FUNCTION issn13(text) | CREATE FUNCTION issn13(text) | ||||||
| RETURNS issn13 | RETURNS issn13 | ||||||
| AS 'MODULE_PATHNAME', 'issn_cast_from_text' | AS 'MODULE_PATHNAME', 'issn_cast_from_text' | ||||||
| LANGUAGE 'C' IMMUTABLE STRICT; | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
| 
 |  | ||||||
| CREATE FUNCTION isbn(text) | CREATE FUNCTION isbn(text) | ||||||
| RETURNS isbn | RETURNS isbn | ||||||
| AS 'MODULE_PATHNAME', 'isbn_cast_from_text' | AS 'MODULE_PATHNAME', 'isbn_cast_from_text' | ||||||
| LANGUAGE 'C' IMMUTABLE STRICT; | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
| 
 |  | ||||||
| CREATE FUNCTION ismn(text) | CREATE FUNCTION ismn(text) | ||||||
| RETURNS ismn | RETURNS ismn | ||||||
| AS 'MODULE_PATHNAME', 'ismn_cast_from_text' | AS 'MODULE_PATHNAME', 'ismn_cast_from_text' | ||||||
| LANGUAGE 'C' IMMUTABLE STRICT; | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
| 
 |  | ||||||
| CREATE FUNCTION issn(text) | CREATE FUNCTION issn(text) | ||||||
| RETURNS issn | RETURNS issn | ||||||
| AS 'MODULE_PATHNAME', 'issn_cast_from_text' | AS 'MODULE_PATHNAME', 'issn_cast_from_text' | ||||||
| LANGUAGE 'C' IMMUTABLE STRICT; | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
| 
 |  | ||||||
| CREATE FUNCTION upc(text) | CREATE FUNCTION upc(text) | ||||||
| RETURNS upc | RETURNS upc | ||||||
| AS 'MODULE_PATHNAME', 'upc_cast_from_text' | AS 'MODULE_PATHNAME', 'upc_cast_from_text' | ||||||
| LANGUAGE 'C' IMMUTABLE STRICT; | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| CREATE FUNCTION text(ean13) | CREATE FUNCTION text(ean13) | ||||||
| RETURNS text | RETURNS text | ||||||
| AS 'MODULE_PATHNAME', 'ean13_cast_to_text' | AS 'MODULE_PATHNAME', 'ean13_cast_to_text' | ||||||
| LANGUAGE 'C' IMMUTABLE STRICT; | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
| 
 |  | ||||||
| CREATE FUNCTION text(isbn13) | CREATE FUNCTION text(isbn13) | ||||||
| RETURNS text | RETURNS text | ||||||
| AS 'MODULE_PATHNAME', 'ean13_cast_to_text' | AS 'MODULE_PATHNAME', 'ean13_cast_to_text' | ||||||
| LANGUAGE 'C' IMMUTABLE STRICT; | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
| 
 |  | ||||||
| CREATE FUNCTION text(ismn13) | CREATE FUNCTION text(ismn13) | ||||||
| RETURNS text | RETURNS text | ||||||
| AS 'MODULE_PATHNAME', 'ean13_cast_to_text' | AS 'MODULE_PATHNAME', 'ean13_cast_to_text' | ||||||
| LANGUAGE 'C' IMMUTABLE STRICT; | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
| 
 |  | ||||||
| CREATE FUNCTION text(issn13) | CREATE FUNCTION text(issn13) | ||||||
| RETURNS text | RETURNS text | ||||||
| AS 'MODULE_PATHNAME', 'ean13_cast_to_text' | AS 'MODULE_PATHNAME', 'ean13_cast_to_text' | ||||||
| LANGUAGE 'C' IMMUTABLE STRICT; | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
| 
 |  | ||||||
| CREATE FUNCTION text(isbn) | CREATE FUNCTION text(isbn) | ||||||
| RETURNS text | RETURNS text | ||||||
| AS 'MODULE_PATHNAME', 'isn_cast_to_text' | AS 'MODULE_PATHNAME', 'isn_cast_to_text' | ||||||
| LANGUAGE 'C' IMMUTABLE STRICT; | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
| 
 |  | ||||||
| CREATE FUNCTION text(ismn) | CREATE FUNCTION text(ismn) | ||||||
| RETURNS text | RETURNS text | ||||||
| AS 'MODULE_PATHNAME', 'isn_cast_to_text' | AS 'MODULE_PATHNAME', 'isn_cast_to_text' | ||||||
| LANGUAGE 'C' IMMUTABLE STRICT; | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
| 
 |  | ||||||
| CREATE FUNCTION text(issn) | CREATE FUNCTION text(issn) | ||||||
| RETURNS text | RETURNS text | ||||||
| AS 'MODULE_PATHNAME', 'isn_cast_to_text' | AS 'MODULE_PATHNAME', 'isn_cast_to_text' | ||||||
| LANGUAGE 'C' IMMUTABLE STRICT; | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
| 
 |  | ||||||
| CREATE FUNCTION text(upc) | CREATE FUNCTION text(upc) | ||||||
| RETURNS text | RETURNS text | ||||||
| AS 'MODULE_PATHNAME', 'isn_cast_to_text' | AS 'MODULE_PATHNAME', 'isn_cast_to_text' | ||||||
| LANGUAGE 'C' IMMUTABLE STRICT; | LANGUAGE 'C' IMMUTABLE STRICT; | ||||||
| 
 | 
 | ||||||
|  | CREATE CAST (ean13 AS isbn13) WITH FUNCTION isbn13(ean13); | ||||||
|  | CREATE CAST (ean13 AS isbn) WITH FUNCTION isbn(ean13); | ||||||
|  | CREATE CAST (ean13 AS ismn13) WITH FUNCTION ismn13(ean13); | ||||||
|  | CREATE CAST (ean13 AS ismn) WITH FUNCTION ismn(ean13); | ||||||
|  | CREATE CAST (ean13 AS issn13) WITH FUNCTION issn13(ean13); | ||||||
|  | CREATE CAST (ean13 AS issn) WITH FUNCTION issn(ean13); | ||||||
|  | CREATE CAST (ean13 AS upc) WITH FUNCTION upc(ean13); | ||||||
|  | 
 | ||||||
| CREATE CAST (isbn13 AS ean13) WITHOUT FUNCTION AS ASSIGNMENT; | CREATE CAST (isbn13 AS ean13) WITHOUT FUNCTION AS ASSIGNMENT; | ||||||
| CREATE CAST (isbn AS ean13) WITHOUT FUNCTION AS ASSIGNMENT; | CREATE CAST (isbn AS ean13) WITHOUT FUNCTION AS ASSIGNMENT; | ||||||
| CREATE CAST (ismn13 AS ean13) WITHOUT FUNCTION AS ASSIGNMENT; | CREATE CAST (ismn13 AS ean13) WITHOUT FUNCTION AS ASSIGNMENT; | ||||||
| @ -2218,6 +2243,7 @@ CREATE CAST (ismn AS ean13) WITHOUT FUNCTION AS ASSIGNMENT; | |||||||
| CREATE CAST (issn13 AS ean13) WITHOUT FUNCTION AS ASSIGNMENT; | CREATE CAST (issn13 AS ean13) WITHOUT FUNCTION AS ASSIGNMENT; | ||||||
| CREATE CAST (issn AS ean13) WITHOUT FUNCTION AS ASSIGNMENT; | CREATE CAST (issn AS ean13) WITHOUT FUNCTION AS ASSIGNMENT; | ||||||
| CREATE CAST (upc AS ean13) WITHOUT FUNCTION AS ASSIGNMENT; | CREATE CAST (upc AS ean13) WITHOUT FUNCTION AS ASSIGNMENT; | ||||||
|  | 
 | ||||||
| CREATE CAST (isbn AS isbn13) WITHOUT FUNCTION AS ASSIGNMENT; | CREATE CAST (isbn AS isbn13) WITHOUT FUNCTION AS ASSIGNMENT; | ||||||
| CREATE CAST (isbn13 AS isbn) WITHOUT FUNCTION AS ASSIGNMENT; | CREATE CAST (isbn13 AS isbn) WITHOUT FUNCTION AS ASSIGNMENT; | ||||||
| CREATE CAST (ismn AS ismn13) WITHOUT FUNCTION AS ASSIGNMENT; | CREATE CAST (ismn AS ismn13) WITHOUT FUNCTION AS ASSIGNMENT; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user