1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-30 21:42:05 +03:00

Implemented Informix special way to treat NULLs, removed warnings, synced.

This commit is contained in:
Michael Meskes
2003-06-25 10:44:21 +00:00
parent ff4c69e021
commit fd3ca524eb
20 changed files with 373 additions and 156 deletions

View File

@ -1,4 +1,4 @@
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/misc.c,v 1.4 2003/06/15 04:56:45 momjian Exp $ */
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/misc.c,v 1.5 2003/06/25 10:44:21 meskes Exp $ */
#define POSTGRES_ECPG_INTERNAL
#include "postgres_fe.h"
@ -12,6 +12,10 @@
#include "ecpgerrno.h"
#include "extern.h"
#include "sqlca.h"
#include "pgtypes_numeric.h"
#include "pgtypes_date.h"
#include "pgtypes_timestamp.h"
#include "pgtypes_interval.h"
static struct sqlca_t sqlca_init =
{
@ -238,3 +242,114 @@ ECPGlog(const char *format,...)
pthread_mutex_unlock(&debug_mutex);
#endif
}
void
ECPGset_informix_null(enum ECPGttype type, void *ptr)
{
switch (type)
{
case ECPGt_char:
case ECPGt_unsigned_char:
*((char *) ptr) = 0x00;
break;
case ECPGt_short:
case ECPGt_unsigned_short:
*((short int *) ptr) = SHRT_MIN;
break;
case ECPGt_int:
case ECPGt_unsigned_int:
*((int *) ptr) = INT_MIN;
break;
case ECPGt_long:
case ECPGt_unsigned_long:
case ECPGt_date:
*((long *) ptr) = LONG_MIN;
break;
#ifdef HAVE_LONG_LONG_INT_64
case ECPGt_long_long:
case ECPGt_unsigned_long_long:
*((long long *) ptr) = LONG_LONG_MIN;
break;
#endif /* HAVE_LONG_LONG_INT_64 */
case ECPGt_float:
memset((char *) ptr, 0xff, sizeof(float));
break;
case ECPGt_double:
memset((char *) ptr, 0xff, sizeof(double));
break;
case ECPGt_varchar:
*(((struct ECPGgeneric_varchar *) ptr)->arr) = 0x00;
break;
case ECPGt_numeric:
((Numeric *) ptr)->sign = NUMERIC_NAN;
break;
case ECPGt_interval:
memset((char *) ptr, 0xff, sizeof(Interval));
break;
case ECPGt_timestamp:
memset((char *) ptr, 0xff, sizeof(Timestamp));
break;
default:
break;
}
}
static bool _check(unsigned char *ptr, int length)
{
for (;ptr[length] == 0xff && length >= 0; length --);
if (length < 0) return true;
return false;
}
bool
ECPGis_informix_null(enum ECPGttype type, void *ptr)
{
switch (type)
{
case ECPGt_char:
case ECPGt_unsigned_char:
if (*((char *)ptr) == 0x00) return true;
break;
case ECPGt_short:
case ECPGt_unsigned_short:
if (*((short int *) ptr) == SHRT_MIN) return true;
break;
case ECPGt_int:
case ECPGt_unsigned_int:
if (*((int *) ptr) == INT_MIN) return true;
break;
case ECPGt_long:
case ECPGt_unsigned_long:
case ECPGt_date:
if (*((long *) ptr) == LONG_MIN) return true;
break;
#ifdef HAVE_LONG_LONG_INT_64
case ECPGt_long_long:
case ECPGt_unsigned_long_long:
if (*((long long *) ptr) == LONG_LONG_MIN) return true;
break;
#endif /* HAVE_LONG_LONG_INT_64 */
case ECPGt_float:
return(_check(ptr, sizeof(float)));
break;
case ECPGt_double:
return(_check(ptr, sizeof(double)));
break;
case ECPGt_varchar:
if (*(((struct ECPGgeneric_varchar *) ptr)->arr) == 0x00) return true;
break;
case ECPGt_numeric:
if (((Numeric *) ptr)->sign == NUMERIC_NAN) return true;
break;
case ECPGt_interval:
return(_check(ptr, sizeof(Interval)));
break;
case ECPGt_timestamp:
return(_check(ptr, sizeof(Timestamp)));
break;
default:
break;
}
return false;
}