int
deccvasc(constchar *cp, int len, decimal *np)
{ char *str; int ret = 0;
numeric *result;
rsetnull(CDECIMALTYPE, (char *) np); if (risnull(CSTRINGTYPE, cp)) return0;
str = ecpg_strndup(cp, len); /* decimal_in always converts the complete
* string */ if (!str)
ret = ECPG_INFORMIX_NUM_UNDERFLOW; else
{
errno = 0;
result = PGTYPESnumeric_from_asc(str, NULL); if (!result)
{ switch (errno)
{ case PGTYPES_NUM_OVERFLOW:
ret = ECPG_INFORMIX_NUM_OVERFLOW; break; case PGTYPES_NUM_BAD_NUMERIC:
ret = ECPG_INFORMIX_BAD_NUMERIC; break; default:
ret = ECPG_INFORMIX_BAD_EXPONENT; break;
}
} else
{ int i = PGTYPESnumeric_to_decimal(result, np);
PGTYPESnumeric_free(result); if (i != 0)
ret = ECPG_INFORMIX_NUM_OVERFLOW;
}
}
free(str); return ret;
}
int
deccvdbl(double dbl, decimal *np)
{
numeric *nres; int result = 1;
rsetnull(CDECIMALTYPE, (char *) np); if (risnull(CDOUBLETYPE, (char *) &dbl)) return0;
nres = PGTYPESnumeric_new(); if (nres == NULL) return ECPG_INFORMIX_OUT_OF_MEMORY;
result = PGTYPESnumeric_from_double(dbl, nres); if (result == 0)
result = PGTYPESnumeric_to_decimal(nres, np);
PGTYPESnumeric_free(nres); return result;
}
int
deccvint(int in, decimal *np)
{
numeric *nres; int result = 1;
rsetnull(CDECIMALTYPE, (char *) np); if (risnull(CINTTYPE, (char *) &in)) return0;
nres = PGTYPESnumeric_new(); if (nres == NULL) return ECPG_INFORMIX_OUT_OF_MEMORY;
result = PGTYPESnumeric_from_int(in, nres); if (result == 0)
result = PGTYPESnumeric_to_decimal(nres, np);
PGTYPESnumeric_free(nres); return result;
}
int
deccvlong(long lng, decimal *np)
{
numeric *nres; int result = 1;
rsetnull(CDECIMALTYPE, (char *) np); if (risnull(CLONGTYPE, (char *) &lng)) return0;
nres = PGTYPESnumeric_new(); if (nres == NULL) return ECPG_INFORMIX_OUT_OF_MEMORY;
result = PGTYPESnumeric_from_long(lng, nres); if (result == 0)
result = PGTYPESnumeric_to_decimal(nres, np);
PGTYPESnumeric_free(nres); return result;
}
int
decdiv(decimal *n1, decimal *n2, decimal *result)
{ int i;
errno = 0;
i = deccall3(n1, n2, result, PGTYPESnumeric_div);
if (i != 0) switch (errno)
{ case PGTYPES_NUM_DIVIDE_ZERO: return ECPG_INFORMIX_DIVIDE_ZERO; break; case PGTYPES_NUM_OVERFLOW: return ECPG_INFORMIX_NUM_OVERFLOW; break; default: return ECPG_INFORMIX_NUM_UNDERFLOW; break;
}
return0;
}
int
decmul(decimal *n1, decimal *n2, decimal *result)
{ int i;
errno = 0;
i = deccall3(n1, n2, result, PGTYPESnumeric_mul);
if (i != 0) switch (errno)
{ case PGTYPES_NUM_OVERFLOW: return ECPG_INFORMIX_NUM_OVERFLOW; break; default: return ECPG_INFORMIX_NUM_UNDERFLOW; break;
}
return0;
}
int
decsub(decimal *n1, decimal *n2, decimal *result)
{ int i;
errno = 0;
i = deccall3(n1, n2, result, PGTYPESnumeric_sub);
if (i != 0) switch (errno)
{ case PGTYPES_NUM_OVERFLOW: return ECPG_INFORMIX_NUM_OVERFLOW; break; default: return ECPG_INFORMIX_NUM_UNDERFLOW; break;
}
return0;
}
int
dectoasc(decimal *np, char *cp, int len, int right)
{ char *str;
numeric *nres;
rsetnull(CSTRINGTYPE, (char *) cp); if (risnull(CDECIMALTYPE, (char *) np)) return0;
nres = PGTYPESnumeric_new(); if (nres == NULL) return ECPG_INFORMIX_OUT_OF_MEMORY;
if (PGTYPESnumeric_from_decimal(np, nres) != 0)
{
PGTYPESnumeric_free(nres); return ECPG_INFORMIX_OUT_OF_MEMORY;
}
int
rdefmtdate(date * d, constchar *fmt, constchar *str)
{ /* TODO: take care of DBCENTURY environment variable */ /* PGSQL functions allow all centuries */
errno = 0; if (PGTYPESdate_defmt_asc(d, fmt, str) == 0) return0;
switch (errno)
{ case PGTYPES_DATE_ERR_ENOSHORTDATE: return ECPG_INFORMIX_ENOSHORTDATE; case PGTYPES_DATE_ERR_EARGS: case PGTYPES_DATE_ERR_ENOTDMY: return ECPG_INFORMIX_ENOTDMY; case PGTYPES_DATE_BAD_DAY: return ECPG_INFORMIX_BAD_DAY; case PGTYPES_DATE_BAD_MONTH: return ECPG_INFORMIX_BAD_MONTH; default: return ECPG_INFORMIX_BAD_YEAR;
}
}
int
rfmtdate(date d, constchar *fmt, char *str)
{
errno = 0; if (PGTYPESdate_fmt_asc(d, fmt, str) == 0) return0;
if (errno == ENOMEM) return ECPG_INFORMIX_OUT_OF_MEMORY;
return ECPG_INFORMIX_DATE_CONVERT;
}
int
rmdyjul(short *mdy, date * d)
{ int mdy_int[3];
int
dtcvasc(char *str, timestamp * ts)
{
timestamp ts_tmp; int i; char **endptr = &str;
errno = 0;
ts_tmp = PGTYPEStimestamp_from_asc(str, endptr);
i = errno; if (i) /* TODO: rewrite to Informix error codes */ return i; if (**endptr)
{ /* extra characters exist at the end */ return ECPG_INFORMIX_EXTRA_CHARS;
} /* TODO: other Informix error codes missing */
/* get position of the right-most dot in the format-string */ /* and fill the temp-string wit '0's up to there. */
dotpos = getRightMostDot(fmt);
/* start to parse the format-string */
temp[0] = '\0';
k = value.digits - 1; /* position in the value_string */ for (i = fmt_len - 1, j = 0; i >= 0; i--, j++)
{ /* qualify, where we are in the value_string */ if (k < 0)
{
blank = 1; if (k == -1)
sign = 1; if (leftalign)
{ /* can't use strncat(,,0) here, Solaris would freak out */ if (sign) if (signdone)
{
temp[j] = '\0'; break;
}
}
} /* if we're right side of the right-most dot, print '0' */ if (dotpos >= 0 && dotpos <= i)
{ if (dotpos < i)
{ if (fmt[i] == ')')
tmp[0] = value.sign == '-' ? ')' : ' '; else
tmp[0] = '0';
} else
tmp[0] = '.';
strcat(temp, tmp); continue;
} /* the ',' needs special attention, if it is in the blank area */ if (blank && fmt[i] == ',')
fmtchar = lastfmt; else
fmtchar = fmt[i]; /* waiting for the sign */ if (k < 0 && leftalign && sign && !signdone && fmtchar != '+' && fmtchar != '-') continue; /* analyse this format-char */ switch (fmtchar)
{ case',':
tmp[0] = ',';
k++; break; case'*': if (blank)
tmp[0] = '*'; else
tmp[0] = value.val_string[k]; break; case'&': if (blank)
tmp[0] = '0'; else
tmp[0] = value.val_string[k]; break; case'#': if (blank)
tmp[0] = ' '; else
tmp[0] = value.val_string[k]; break; case'-': if (sign && value.sign == '-' && !signdone)
{
tmp[0] = '-';
signdone = 1;
} elseif (blank)
tmp[0] = ' '; else
tmp[0] = value.val_string[k]; break; case'+': if (sign && !signdone)
{
tmp[0] = value.sign;
signdone = 1;
} elseif (blank)
tmp[0] = ' '; else
tmp[0] = value.val_string[k]; break; case'(': if (sign && brackets_ok && value.sign == '-')
tmp[0] = '('; elseif (blank)
tmp[0] = ' '; else
tmp[0] = value.val_string[k]; break; case')': if (brackets_ok && value.sign == '-')
tmp[0] = ')'; else
tmp[0] = ' '; break; case'$': if (blank && !entitydone)
{
tmp[0] = '$';
entitydone = 1;
} elseif (blank)
tmp[0] = ' '; else
tmp[0] = value.val_string[k]; break; case'<':
tmp[0] = value.val_string[k]; break; default:
tmp[0] = fmt[i];
}
strcat(temp, tmp);
lastfmt = fmt[i];
k--;
} /* safety-net */
temp[fmt_len] = '\0';
/* reverse the temp-string and put it into the outbuf */
temp_len = strlen(temp);
outbuf[0] = '\0'; for (i = temp_len - 1; i >= 0; i--)
{
tmp[0] = temp[i];
strcat(outbuf, tmp);
}
outbuf[temp_len] = '\0';
/* cleaning up */
free(temp);
free(value.val_string);
return0;
}
void
rupshift(char *str)
{ for (; *str != '\0'; str++) if (islower((unsignedchar) *str))
*str = toupper((unsignedchar) *str);
}
int
byleng(char *str, int len)
{ for (len--; str[len] && str[len] == ' '; len--); return (len + 1);
}
void
ldchar(char *src, int len, char *dest)
{ int dlen = byleng(src, len);
memmove(dest, src, dlen);
dest[dlen] = '\0';
}
int
rgetmsg(int msgnum, char *s, int maxsize)
{
(void) msgnum; /* keep the compiler quiet */
(void) s; /* keep the compiler quiet */
(void) maxsize; /* keep the compiler quiet */ return0;
}
int
rtypalign(int offset, int type)
{
(void) offset; /* keep the compiler quiet */
(void) type; /* keep the compiler quiet */ return0;
}
int
rtypmsize(int type, int len)
{
(void) type; /* keep the compiler quiet */
(void) len; /* keep the compiler quiet */ return0;
}
int
rtypwidth(int sqltype, int sqllen)
{
(void) sqltype; /* keep the compiler quiet */
(void) sqllen; /* keep the compiler quiet */ return0;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.