TCL_ARRAYS option patches from Massimo Dal Zotto
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 17 Jan 1999 21:12:55 +0000 (21:12 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 17 Jan 1999 21:12:55 +0000 (21:12 +0000)
src/backend/utils/adt/arrayfuncs.c
src/interfaces/libpgtcl/pgtclCmds.c

index 7a4a14583b94ddeebbf89a3a3721df32b1255333..b718ce01367e50785c6a542088c653e0536ccbc3 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.35 1999/01/17 06:18:45 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.36 1999/01/17 21:12:55 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -699,8 +699,10 @@ array_out(ArrayType *v, Oid element_type)
        for (tmp = values[i]; *tmp; tmp++)
        {
            overall_length += 1;
+#ifndef TCL_ARRAYS
            if (*tmp == '"')
                overall_length += 1;
+#endif
        }
        overall_length += 1;
    }
@@ -729,6 +731,7 @@ array_out(ArrayType *v, Oid element_type)
        if (!typbyval)
        {
            strcat(p, "\"");
+#ifndef TCL_ARRAYS
            l = strlen(p);
            for (tmp = values[k]; *tmp; tmp++)
            {
@@ -737,6 +740,9 @@ array_out(ArrayType *v, Oid element_type)
                p[l++] = *tmp;
            }
            p[l] = '\0';
+#else
+           strcat(p, values[k]);
+#endif
            strcat(p, "\"");
        }
        else
index 258c780e590f3f00bb7934171d64b8c34fdd126b..57f0ab0dd0723447f914c6376b6a9c9ac8cfaeac 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclCmds.c,v 1.38 1998/10/14 15:17:51 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclCmds.c,v 1.39 1999/01/17 21:12:55 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -472,39 +472,50 @@ Pg_exec(ClientData cData, Tcl_Interp * interp, int argc, char *argv[])
  get information about the results of a query
 
  syntax:
- pg_result result ?option?
+
+   pg_result result ?option?
 
  the options are:
- -status
- the status of the result
- -error
- the error message, if the status indicates error; otherwise an empty string
- -conn
- the connection that produced the result
- -oid
- if command was an INSERT, the OID of the inserted tuple
- -numTuples
- the number of tuples in the query
- -numAttrs
- returns the number of attributes returned by the query
- -assign arrayName
- assign the results to an array, using subscripts of the form
- (tupno,attributeName)
- -assignbyidx arrayName ?appendstr?
- assign the results to an array using the first field's value as a key.
- All but the first field of each tuple are stored, using subscripts of the form
- (field0value,attributeNameappendstr)
- -getTuple tupleNumber
- returns the values of the tuple in a list
- -tupleArray tupleNumber arrayName
- stores the values of the tuple in array arrayName, indexed
- by the attributes returned
- -attributes
- returns a list of the name/type pairs of the tuple attributes
- -lAttributes
- returns a list of the {name type len} entries of the tuple attributes
- -clear
- clear the result buffer. Do not reuse after this
+
+   -status     the status of the result
+
+   -error      the error message, if the status indicates error; otherwise
+               an empty string
+
+   -conn       the connection that produced the result
+
+   -oid        if command was an INSERT, the OID of the inserted tuple
+
+   -numTuples  the number of tuples in the query
+
+   -numAttrs   returns the number of attributes returned by the query
+
+   -assign arrayName
+               assign the results to an array, using subscripts of the form
+               (tupno,attributeName)
+
+   -assignbyidx arrayName ?appendstr?
+               assign the results to an array using the first field's value
+               as a key.
+               All but the first field of each tuple are stored, using
+               subscripts of the form (field0value,attributeNameappendstr)
+
+   -getTuple tupleNumber
+               returns the values of the tuple in a list
+
+   -tupleArray tupleNumber arrayName
+               stores the values of the tuple in array arrayName, indexed
+               by the attributes returned
+
+   -attributes
+               returns a list of the name/type pairs of the tuple attributes
+
+   -lAttributes
+               returns a list of the {name type len} entries of the tuple
+               attributes
+
+    -clear     clear the result buffer. Do not reuse after this
+
  **********************************/
 int
 Pg_result(ClientData cData, Tcl_Interp * interp, int argc, char *argv[])
@@ -621,15 +632,24 @@ Pg_result(ClientData cData, Tcl_Interp * interp, int argc, char *argv[])
         */
        for (tupno = 0; tupno < PQntuples(result); tupno++)
        {
-           const char *field0 = PQgetvalue(result, tupno, 0);
-           char * workspace = malloc(strlen(field0) + strlen(appendstr) + 210);
+           const char *field0 = 
+#ifdef TCL_ARRAYS
+                                tcl_value(PQgetvalue(result, tupno, 0));
+#else
+                                PQgetvalue(result, tupno, 0);
+#endif
+           char *workspace = malloc(strlen(field0) + strlen(appendstr) + 210);
 
            for (i = 1; i < PQnfields(result); i++)
            {
                sprintf(workspace, "%s,%.200s%s", field0, PQfname(result,i),
                        appendstr);
                if (Tcl_SetVar2(interp, arrVar, workspace,
+#ifdef TCL_ARRAYS
+                               tcl_value(PQgetvalue(result, tupno, i)),
+#else
                                PQgetvalue(result, tupno, i),
+#endif
                                TCL_LEAVE_ERR_MSG) == NULL)
                {
                    free(workspace);
@@ -654,8 +674,15 @@ Pg_result(ClientData cData, Tcl_Interp * interp, int argc, char *argv[])
            Tcl_AppendResult(interp, "argument to getTuple cannot exceed number of tuples - 1", 0);
            return TCL_ERROR;
        }
+#ifdef TCL_ARRAYS
+       for (i = 0; i < PQnfields(result); i++)
+       {
+           Tcl_AppendElement(interp, tcl_value(PQgetvalue(result, tupno, i)));
+       }
+#else
        for (i = 0; i < PQnfields(result); i++)
            Tcl_AppendElement(interp, PQgetvalue(result, tupno, i));
+#endif
        return TCL_OK;
    }
    else if (strcmp(opt, "-tupleArray") == 0)
@@ -674,7 +701,11 @@ Pg_result(ClientData cData, Tcl_Interp * interp, int argc, char *argv[])
        for (i = 0; i < PQnfields(result); i++)
        {
            if (Tcl_SetVar2(interp, argv[4], PQfname(result, i),
+#ifdef TCL_ARRAYS
+                           tcl_value(PQgetvalue(result, tupno, i)),
+#else
                            PQgetvalue(result, tupno, i),
+#endif
                            TCL_LEAVE_ERR_MSG) == NULL)
                return TCL_ERROR;
        }
@@ -1302,7 +1333,13 @@ Pg_select(ClientData cData, Tcl_Interp * interp, int argc, char **argv)
        Tcl_SetVar2(interp, argv[3], ".tupno", buffer, 0);
 
        for (column = 0; column < ncols; column++)
-           Tcl_SetVar2(interp, argv[3], info[column].cname, PQgetvalue(result, tupno, column), 0);
+           Tcl_SetVar2(interp, argv[3], info[column].cname,
+#ifdef TCL_ARRAYS
+                       tcl_value(PQgetvalue(result, tupno, column)),
+#else
+                       PQgetvalue(result, tupno, column),
+#endif
+                       0);
 
        Tcl_SetVar2(interp, argv[3], ".command", "update", 0);