Informix fixes.
authorMichael Meskes
Thu, 10 Apr 2003 13:06:57 +0000 (13:06 +0000)
committerMichael Meskes
Thu, 10 Apr 2003 13:06:57 +0000 (13:06 +0000)
src/interfaces/ecpg/compatlib/informix.c

index fe12da7b0d58a5062f4df5b4dfbf2752835ab228..cacc1609c1773c3bd29435cd3094745acc4f5d04 100644 (file)
 int
 decadd(Numeric *arg1, Numeric *arg2, Numeric *sum)
 {
-   int i = PGTYPESnumeric_add(arg1, arg2, sum);
+   Numeric *temp_sum = malloc(sizeof(Numeric)) ;
+   int i;
+   
+   if (temp_sum == NULL)
+       return -1211;
+   
+   i = PGTYPESnumeric_add(arg1, arg2, temp_sum);
 
    if (i == 0) /* No error */
+   {
+
+       if (PGTYPESnumeric_copy(temp_sum, sum) !=0)
+           return -1211;
+
+       free(temp_sum);
        return 0;
-   if (errno == PGTYPES_NUM_OVERFLOW)
-       return -1200;
+   }
+   else
+   {
+       free(temp_sum);
+       
+       if (errno == PGTYPES_NUM_OVERFLOW)
+           return -1200;
+   }
 
    return -1201;   
 }
@@ -26,7 +44,6 @@ deccmp(Numeric *arg1, Numeric *arg2)
 {
    int i = PGTYPESnumeric_cmp(arg1, arg2);
    
-   /* TODO: Need to return DECUNKNOWN instead of PGTYPES_NUM_BAD_NUMERIC */
    return (i);
 }
 
@@ -46,7 +63,7 @@ strndup(char *str, int len)
 
    if (new)
    {
-       memcpy(str, new, use_len);
+       memcpy(new, str, use_len);
        new[use_len] = '\0';
    }
    else
@@ -60,13 +77,14 @@ deccvasc(char *cp, int len, Numeric *np)
 {
    char *str = strndup(cp, len); /* Numeric_in always converts the complete string */
    int ret = 0;
+   Numeric *result;
    
    if (!str)
        ret = -1201;
    else
    {
-       np = PGTYPESnumeric_from_asc(str, NULL);
-       if (!np)
+       result = PGTYPESnumeric_from_asc(str, NULL);
+       if (!result)
        {
            switch (errno)
            {
@@ -78,6 +96,13 @@ deccvasc(char *cp, int len, Numeric *np)
                              break;
            }
        }
+       else
+       {
+           if (PGTYPESnumeric_copy(result, np) !=0)
+               ret = -1211;
+
+           free(result);
+       }
    }
    
    return ret;
@@ -104,7 +129,13 @@ deccvlong(long lng, Numeric *np)
 int
 decdiv(Numeric *n1, Numeric *n2, Numeric *n3)
 {
-   int i = PGTYPESnumeric_div(n1, n2, n3), ret = 0;
+   Numeric *temp = malloc(sizeof(Numeric));
+   int i, ret = 0;
+
+   if (temp == NULL)
+       return -1211;
+   
+   i = PGTYPESnumeric_div(n1, n2, temp);
 
    if (i != 0)
        switch (errno)
@@ -116,14 +147,24 @@ decdiv(Numeric *n1, Numeric *n2, Numeric *n3)
            default:          ret = -1201;
                          break;
        }
-
+   else
+       if (PGTYPESnumeric_copy(temp, n3) !=0)
+           ret = -1211;
+       
+   free(temp);
    return ret;
 }
 
 int 
 decmul(Numeric *n1, Numeric *n2, Numeric *n3)
 {
-   int i = PGTYPESnumeric_mul(n1, n2, n3), ret = 0;
+   Numeric *temp = malloc(sizeof(Numeric));
+   int i, ret = 0;
+   
+   if (temp == NULL)
+       return -1211;
+   
+   i = PGTYPESnumeric_mul(n1, n2, temp);
 
    if (i != 0)
        switch (errno)
@@ -133,6 +174,11 @@ decmul(Numeric *n1, Numeric *n2, Numeric *n3)
            default:          ret = -1201;
                          break;
        }
+   else
+       if (PGTYPESnumeric_copy(temp, n3) !=0)
+           ret = -1211;
+       
+   free(temp);
 
    return ret;
 }
@@ -140,7 +186,13 @@ decmul(Numeric *n1, Numeric *n2, Numeric *n3)
 int
 decsub(Numeric *n1, Numeric *n2, Numeric *n3)
 {
-   int i = PGTYPESnumeric_sub(n1, n2, n3), ret = 0;
+   Numeric *temp = malloc(sizeof(Numeric));
+   int i, ret = 0;
+   
+   if (temp == NULL)
+       return -1211;
+   
+   i = PGTYPESnumeric_sub(n1, n2, temp);
 
    if (i != 0)
        switch (errno)
@@ -150,6 +202,11 @@ decsub(Numeric *n1, Numeric *n2, Numeric *n3)
            default:          ret = -1201;
                          break;
        }
+   else
+       if (PGTYPESnumeric_copy(temp, n3) !=0)
+           ret = -1211;
+       
+   free(temp);
 
    return ret;
 }