aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/ecpg/compatlib/informix.c
diff options
context:
space:
mode:
authorMichael Meskes <meskes@postgresql.org>2003-03-30 13:26:09 +0000
committerMichael Meskes <meskes@postgresql.org>2003-03-30 13:26:09 +0000
commit5e37f16be0ec70489ce12e3cbc4f5c097f61ce17 (patch)
tree67108136466ecdc59537fba435944283845f5c61 /src/interfaces/ecpg/compatlib/informix.c
parent999f12982e6180a88aedc76f8e6e25f461367761 (diff)
downloadpostgresql-5e37f16be0ec70489ce12e3cbc4f5c097f61ce17.tar.gz
postgresql-5e37f16be0ec70489ce12e3cbc4f5c097f61ce17.zip
Forgot two new files and one that was moved.
Diffstat (limited to 'src/interfaces/ecpg/compatlib/informix.c')
-rw-r--r--src/interfaces/ecpg/compatlib/informix.c361
1 files changed, 361 insertions, 0 deletions
diff --git a/src/interfaces/ecpg/compatlib/informix.c b/src/interfaces/ecpg/compatlib/informix.c
new file mode 100644
index 00000000000..b8fd79acde7
--- /dev/null
+++ b/src/interfaces/ecpg/compatlib/informix.c
@@ -0,0 +1,361 @@
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include <ecpg_informix.h>
+#include <pgtypes_error.h>
+#include <pgtypes_date.h>
+
+/* we start with the numeric functions */
+int
+decadd(Numeric *arg1, Numeric *arg2, Numeric *sum)
+{
+ int i = PGTYPESnumeric_add(arg1, arg2, sum);
+
+ if (i == 0) /* No error */
+ return 0;
+ if (errno == PGTYPES_NUM_OVERFLOW)
+ return -1200;
+
+ return -1201;
+}
+
+int
+deccmp(Numeric *arg1, Numeric *arg2)
+{
+ int i = PGTYPESnumeric_cmp(arg1, arg2);
+
+ /* TODO: Need to return DECUNKNOWN instead of PGTYPES_NUM_BAD_NUMERIC */
+ return (i);
+}
+
+void
+deccopy(Numeric *src, Numeric *target)
+{
+ PGTYPESnumeric_copy(src, target);
+}
+
+static char *
+strndup(char *str, int len)
+{
+ int real_len = strlen(str);
+ int use_len = (real_len > len) ? len : real_len;
+
+ char *new = malloc(use_len + 1);
+
+ if (new)
+ {
+ memcpy(str, new, use_len);
+ new[use_len] = '\0';
+ }
+ else
+ errno = ENOMEM;
+
+ return new;
+}
+
+int
+deccvasc(char *cp, int len, Numeric *np)
+{
+ char *str = strndup(cp, len); /* Numeric_in always converts the complete string */
+ int ret = 0;
+
+ if (!str)
+ ret = -1201;
+ else
+ {
+ np = PGTYPESnumeric_aton(str, NULL);
+ if (!np)
+ {
+ switch (errno)
+ {
+ case PGTYPES_NUM_OVERFLOW: ret = -1200;
+ break;
+ case PGTYPES_NUM_BAD_NUMERIC: ret = -1213;
+ break;
+ default: ret = -1216;
+ break;
+ }
+ }
+ }
+
+ return ret;
+}
+
+int
+deccvdbl(double dbl, Numeric *np)
+{
+ return(PGTYPESnumeric_dton(dbl, np));
+}
+
+int
+deccvint(int in, Numeric *np)
+{
+ return(PGTYPESnumeric_iton(in, np));
+}
+
+int
+deccvlong(long lng, Numeric *np)
+{
+ return(PGTYPESnumeric_lton(lng, np));
+}
+
+int
+decdiv(Numeric *n1, Numeric *n2, Numeric *n3)
+{
+ int i = PGTYPESnumeric_div(n1, n2, n3), ret = 0;
+
+ if (i != 0)
+ switch (errno)
+ {
+ case PGTYPES_NUM_DIVIDE_ZERO: ret = -1202;
+ break;
+ case PGTYPES_NUM_OVERFLOW: ret = -1200;
+ break;
+ default: ret = -1201;
+ break;
+ }
+
+ return ret;
+}
+
+int
+decmul(Numeric *n1, Numeric *n2, Numeric *n3)
+{
+ int i = PGTYPESnumeric_mul(n1, n2, n3), ret = 0;
+
+ if (i != 0)
+ switch (errno)
+ {
+ case PGTYPES_NUM_OVERFLOW: ret = -1200;
+ break;
+ default: ret = -1201;
+ break;
+ }
+
+ return ret;
+}
+
+int
+decsub(Numeric *n1, Numeric *n2, Numeric *n3)
+{
+ int i = PGTYPESnumeric_sub(n1, n2, n3), ret = 0;
+
+ if (i != 0)
+ switch (errno)
+ {
+ case PGTYPES_NUM_OVERFLOW: ret = -1200;
+ break;
+ default: ret = -1201;
+ break;
+ }
+
+ return ret;
+}
+
+int
+dectoasc(Numeric *np, char *cp, int len, int right)
+{
+ char *str;
+
+ if (right >= 0)
+ str = PGTYPESnumeric_ntoa(np, right);
+ else
+ str = PGTYPESnumeric_ntoa(np, 0);
+
+ if (!str)
+ return -1;
+
+ /* TODO: have to take care of len here and create exponatial notion if necessary */
+ strncpy(cp, str, len);
+ free (str);
+
+ return 0;
+}
+
+int
+dectodbl(Numeric *np, double *dblp)
+{
+ return(PGTYPESnumeric_ntod(np, dblp));
+}
+
+int
+dectoint(Numeric *np, int *ip)
+{
+ int ret = PGTYPESnumeric_ntoi(np, ip);
+
+ if (ret == PGTYPES_NUM_OVERFLOW)
+ ret = -1200;
+
+ return ret;
+}
+
+int
+dectolong(Numeric *np, long *lngp)
+{
+ int ret = PGTYPESnumeric_ntol(np, lngp);
+
+ if (ret == PGTYPES_NUM_OVERFLOW)
+ ret = -1200;
+
+ return ret;
+}
+
+/* Now the date functions */
+int
+rdatestr (Date d, char *str)
+{
+ char *tmp = PGTYPESdate_dtoa(d);
+
+ if (!tmp)
+ return -1210;
+
+ /* move to user allocated buffer */
+ strcpy(tmp, str);
+ free(str);
+
+ return 0;
+}
+
+void
+rtoday (Date *d)
+{
+ PGTYPESdate_today(d);
+ return;
+}
+
+int
+rjulmdy (Date d, short mdy[3])
+{
+ PGTYPESdate_julmdy(d, (int *)mdy);
+ return 0;
+}
+
+int
+rdefmtdate (Date *d, char *fmt, char *str)
+{
+ /* TODO: take care of DBCENTURY environment variable */
+ /* PGSQL functions allow all centuries */
+
+ if (PGTYPESdate_defmtdate(d, fmt, str) == 0)
+ return 0;
+
+ switch (errno)
+ {
+ case PGTYPES_DATE_ERR_ENOSHORTDATE: return -1209;
+ case PGTYPES_DATE_ERR_EARGS:
+ case PGTYPES_DATE_ERR_ENOTDMY: return -1212;
+ case PGTYPES_DATE_BAD_DAY: return -1204;
+ case PGTYPES_DATE_BAD_MONTH: return -1205;
+ default: return -1206;
+ }
+}
+
+int
+rfmtdate (Date d, char *fmt, char *str)
+{
+ if (PGTYPESdate_fmtdate(d, fmt, str) == 0)
+ return 0;
+
+ if (errno == ENOMEM)
+ return -1211;
+
+ return -1210;
+}
+
+int
+rmdyjul (short mdy[3], Date *d)
+{
+ PGTYPESdate_mdyjul((int *)mdy, d);
+ return 0;
+}
+
+/* And the datetime stuff */
+
+void
+dtcurrent (Timestamp *ts)
+{
+ return;
+}
+
+int
+dtcvasc (char *str, Timestamp *ts)
+{
+ return 0;
+}
+
+int
+dtsub (Timestamp *ts1, Timestamp *ts2, Interval *iv)
+{
+ return 0;
+}
+
+int
+dttoasc (Timestamp *ts, char *output)
+{
+ return 0;
+}
+
+int
+dttofmtasc (Timestamp *ts, char *output, int str_len, char *fmtstr)
+{
+ return 0;
+}
+
+int
+intoasc(Interval *i, char *str)
+{
+ return 0;
+}
+
+/* And finally some misc functions */
+int
+rstrdate (char *str, Date *d)
+{
+ return 0;
+}
+
+int
+rfmtlong(long lvalue, char *format, char *outbuf)
+{
+ return 0;
+}
+
+int
+rgetmsg(int msgnum, char *s, int maxsize)
+{
+ return 0;
+}
+
+int
+risnull(int vtype, char *pcvar)
+{
+ return 0;
+}
+
+int
+rsetnull(int vtype, char *pcvar)
+{
+ return 0;
+}
+
+int
+rtypalign(int offset, int type)
+{
+ return 0;
+}
+
+int
+rtypmsize(int type, int len)
+{
+ return 0;
+}
+
+void
+rupshift(char *s)
+{
+ return;
+}
+
+
+