]> granicus.if.org Git - postgresql/commitdiff
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);