]> granicus.if.org Git - postgresql/commitdiff
Commit the remaining parts of the array changes.
authorMichael Meskes <meskes@postgresql.org>
Wed, 12 Nov 2003 08:42:57 +0000 (08:42 +0000)
committerMichael Meskes <meskes@postgresql.org>
Wed, 12 Nov 2003 08:42:57 +0000 (08:42 +0000)
src/interfaces/ecpg/ecpglib/data.c
src/interfaces/ecpg/ecpglib/execute.c
src/interfaces/ecpg/ecpglib/extern.h

index e1cfc3d2e7c8c04d7dd57e031b63ae41d74aab21..5aa46b94dded34bd6748373f78cb7396b46caa2a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.20 2003/09/20 09:10:09 meskes Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.20.2.1 2003/11/12 08:42:57 meskes Exp $ */
 
 #define POSTGRES_ECPG_INTERNAL
 #include "postgres_fe.h"
 #include "pgtypes_timestamp.h"
 #include "pgtypes_interval.h"
 
+static bool garbage_left(enum ARRAY_TYPE isarray, char *scan_length, enum COMPAT_MODE compat)
+{
+       /* INFORMIX allows for selecting a numeric into an int, the result is truncated */
+       if (isarray == ECPG_ARRAY_NONE && INFORMIX_MODE(compat) && *scan_length == '.') 
+               return false;
+       
+       if (isarray == ECPG_ARRAY_ARRAY && *scan_length != ',' && *scan_length != '}')
+               return true;
+
+       if (isarray == ECPG_ARRAY_VECTOR && *scan_length != ' ' && *scan_length != '\0')
+               return true;
+
+       if (isarray == ECPG_ARRAY_NONE && *scan_length != ' ' && *scan_length != '\0')
+               return true;
+
+       return false;
+}
+
 bool
 ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                         enum ECPGttype type, enum ECPGttype ind_type,
                         char *var, char *ind, long varcharsize, long offset,
-                        long ind_offset, bool isarray, enum COMPAT_MODE compat, bool force_indicator)
+                        long ind_offset, enum ARRAY_TYPE isarray, enum COMPAT_MODE compat, bool force_indicator)
 {
        struct sqlca_t *sqlca = ECPGget_sqlca();
        char       *pval = (char *) PQgetvalue(results, act_tuple, act_field);
        int                     value_for_indicator = 0;
 
-       ECPGlog("ECPGget_data line %d: RESULT: %s offset: %ld\n", lineno, pval ? pval : "", offset);
+       ECPGlog("ECPGget_data line %d: RESULT: %s offset: %ld array: %d\n", lineno, pval ? pval : "", offset, isarray);
 
        /* pval is a pointer to the value */
-       /* let's check is it really is an array if it should be one */
-       if (isarray)
+       /* let's check if it really is an array if it should be one */
+       if (isarray == ECPG_ARRAY_ARRAY)
        {
                if (*pval != '{')
                {
@@ -126,9 +144,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                if (pval)
                                {
                                        res = strtol(pval, &scan_length, 10);
-                                       /* INFORMIX allows for selecting a numeric into an int, the result is truncated */
-                                       if ((isarray && *scan_length != ',' && *scan_length != '}')
-                                               || (!isarray && !(INFORMIX_MODE(compat) && *scan_length == '.') && *scan_length != '\0' && *scan_length != ' '))        /* Garbage left */
+                                       if (garbage_left(isarray, scan_length, compat))
                                        {
                                                ECPGraise(lineno, ECPG_INT_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
                                                return (false);
@@ -160,8 +176,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                if (pval)
                                {
                                        ures = strtoul(pval, &scan_length, 10);
-                                       if ((isarray && *scan_length != ',' && *scan_length != '}')
-                                               || (!isarray && !(INFORMIX_MODE(compat) && *scan_length == '.') && *scan_length != '\0' && *scan_length != ' '))        /* Garbage left */
+                                       if (garbage_left(isarray, scan_length, compat))
                                        {
                                                ECPGraise(lineno, ECPG_UINT_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
                                                return (false);
@@ -193,8 +208,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                if (pval)
                                {
                                        *((long long int *) (var + offset * act_tuple)) = strtoll(pval, &scan_length, 10);
-                                       if ((isarray && *scan_length != ',' && *scan_length != '}')
-                                               || (!isarray && !(INFORMIX_MODE(compat) && *scan_length == '.') && *scan_length != '\0' && *scan_length != ' '))        /* Garbage left */
+                                       if (garbage_left(isarray, scan_length, compat))
                                        {
                                                ECPGraise(lineno, ECPG_INT_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
                                                return (false);
@@ -236,8 +250,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                        if (isarray && *scan_length == '"')
                                                scan_length++;
 
-                                       if ((isarray && *scan_length != ',' && *scan_length != '}')
-                                               || (!isarray && *scan_length != '\0' && *scan_length != ' '))   /* Garbage left */
+                                       if (garbage_left(isarray, scan_length, compat))
                                        {
                                                ECPGraise(lineno, ECPG_FLOAT_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
                                                return (false);
@@ -411,8 +424,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                                if (isarray && *scan_length == '"')
                                                        scan_length++;
 
-                                               if ((isarray && *scan_length != ',' && *scan_length != '}')
-                                                       || (!isarray && *scan_length != '\0' && *scan_length != ' '))   /* Garbage left */
+                                               if (garbage_left(isarray, scan_length, compat))
                                                {
                                                        ECPGraise(lineno, ECPG_NUMERIC_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
                                                        return (false);
@@ -455,8 +467,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                                if (isarray && *scan_length == '"')
                                                        scan_length++;
 
-                                               if ((isarray && *scan_length != ',' && *scan_length != '}')
-                                                       || (!isarray && *scan_length != '\0' && *scan_length != ' '))   /* Garbage left */
+                                               if (garbage_left(isarray, scan_length, compat))
                                                {
                                                        ECPGraise(lineno, ECPG_INTERVAL_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
                                                        return (false);
@@ -495,8 +506,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                                if (isarray && *scan_length == '"')
                                                        scan_length++;
 
-                                               if ((isarray && *scan_length != ',' && *scan_length != '}')
-                                                       || (!isarray && *scan_length != '\0' && *scan_length != ' '))   /* Garbage left */
+                                               if (garbage_left(isarray, scan_length, compat))
                                                {
                                                        ECPGraise(lineno, ECPG_DATE_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
                                                        return (false);
@@ -534,8 +544,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                                if (isarray && *scan_length == '"')
                                                        scan_length++;
 
-                                               if ((isarray && *scan_length != ',' && *scan_length != '}')
-                                                       || (!isarray && *scan_length != '\0' && *scan_length != ' '))   /* Garbage left */
+                                               if (garbage_left(isarray, scan_length, compat))
                                                {
                                                        ECPGraise(lineno, ECPG_TIMESTAMP_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
                                                        return (false);
@@ -551,7 +560,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                return (false);
                                break;
                }
-               if (isarray)
+               if (isarray == ECPG_ARRAY_ARRAY)
                {
                        bool            string = false;
 
@@ -566,7 +575,22 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                        if (*pval == ',')
                                ++pval;
                }
-       } while (isarray && *pval != '}');
+               else if (isarray == ECPG_ARRAY_VECTOR)
+               {
+                       bool            string = false;
+
+                       /* set array to next entry */
+                       ++act_tuple;
+
+                       /* set pval to the next entry */
+                       for (; string || (*pval != ' ' && *pval != '\0'); ++pval)
+                               if (*pval == '"')
+                                       string = string ? false : true;
+
+                       if (*pval == ' ')
+                               ++pval;
+               }
+       } while ((isarray == ECPG_ARRAY_ARRAY && *pval != '}') || (isarray == ECPG_ARRAY_VECTOR && *pval != '\0'));
 
        return (true);
 }
index 2209e75941cbc66e4707932b625b7ff64999b2f6..18fa03bac2e857c5384c2eb68646e5fd0768871c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.26.2.1 2003/11/10 20:28:06 meskes Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.26.2.2 2003/11/12 08:42:57 meskes Exp $ */
 
 /*
  * The aim is to get a simpler inteface to the database routines.
index 3976d5b24dbf3c050424ce702e671b408063e01e..b265247f38cf2baa81db7d4810187f16134bb880 100644 (file)
@@ -12,13 +12,18 @@ enum COMPAT_MODE
 
 #define INFORMIX_MODE(X) ((X) == ECPG_COMPAT_INFORMIX || (X) == ECPG_COMPAT_INFORMIX_SE)
 
+enum ARRAY_TYPE
+{
+       ECPG_ARRAY_NOT_SET, ECPG_ARRAY_ARRAY, ECPG_ARRAY_VECTOR, ECPG_ARRAY_NONE
+};
+
 /* Here are some methods used by the lib. */
 
 /* Returns a pointer to a string containing a simple type name. */
 void           ECPGadd_mem(void *ptr, int lineno);
 
 bool ECPGget_data(const PGresult *, int, int, int, enum ECPGttype type,
-                        enum ECPGttype, char *, char *, long, long, long, bool, enum COMPAT_MODE, bool);
+                        enum ECPGttype, char *, char *, long, long, long, enum ARRAY_TYPE, enum COMPAT_MODE, bool);
 struct connection *ECPGget_connection(const char *);
 char      *ECPGalloc(long, int);
 char      *ECPGrealloc(void *, long, int);