Commit 5d2cf6af authored by Tom Lane's avatar Tom Lane

TCL_ARRAYS option patches from Massimo Dal Zotto

parent f134a1a9
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -699,8 +699,10 @@ array_out(ArrayType *v, Oid element_type)
for (tmp = values[i]; *tmp; tmp++) for (tmp = values[i]; *tmp; tmp++)
{ {
overall_length += 1; overall_length += 1;
#ifndef TCL_ARRAYS
if (*tmp == '"') if (*tmp == '"')
overall_length += 1; overall_length += 1;
#endif
} }
overall_length += 1; overall_length += 1;
} }
...@@ -729,6 +731,7 @@ array_out(ArrayType *v, Oid element_type) ...@@ -729,6 +731,7 @@ array_out(ArrayType *v, Oid element_type)
if (!typbyval) if (!typbyval)
{ {
strcat(p, "\""); strcat(p, "\"");
#ifndef TCL_ARRAYS
l = strlen(p); l = strlen(p);
for (tmp = values[k]; *tmp; tmp++) for (tmp = values[k]; *tmp; tmp++)
{ {
...@@ -737,6 +740,9 @@ array_out(ArrayType *v, Oid element_type) ...@@ -737,6 +740,9 @@ array_out(ArrayType *v, Oid element_type)
p[l++] = *tmp; p[l++] = *tmp;
} }
p[l] = '\0'; p[l] = '\0';
#else
strcat(p, values[k]);
#endif
strcat(p, "\""); strcat(p, "\"");
} }
else else
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * 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[]) ...@@ -472,39 +472,50 @@ Pg_exec(ClientData cData, Tcl_Interp * interp, int argc, char *argv[])
get information about the results of a query get information about the results of a query
syntax: syntax:
pg_result result ?option?
pg_result result ?option?
the options are: the options are:
-status
the status of the result -status the status of the result
-error
the error message, if the status indicates error; otherwise an empty string -error the error message, if the status indicates error; otherwise
-conn an empty string
the connection that produced the result
-oid -conn the connection that produced the result
if command was an INSERT, the OID of the inserted tuple
-numTuples -oid if command was an INSERT, the OID of the inserted tuple
the number of tuples in the query
-numAttrs -numTuples the number of tuples in the query
returns the number of attributes returned by the query
-assign arrayName -numAttrs returns the number of attributes returned by the query
assign the results to an array, using subscripts of the form
(tupno,attributeName) -assign arrayName
-assignbyidx arrayName ?appendstr? assign the results to an array, using subscripts of the form
assign the results to an array using the first field's value as a key. (tupno,attributeName)
All but the first field of each tuple are stored, using subscripts of the form
(field0value,attributeNameappendstr) -assignbyidx arrayName ?appendstr?
-getTuple tupleNumber assign the results to an array using the first field's value
returns the values of the tuple in a list as a key.
-tupleArray tupleNumber arrayName All but the first field of each tuple are stored, using
stores the values of the tuple in array arrayName, indexed subscripts of the form (field0value,attributeNameappendstr)
by the attributes returned
-attributes -getTuple tupleNumber
returns a list of the name/type pairs of the tuple attributes returns the values of the tuple in a list
-lAttributes
returns a list of the {name type len} entries of the tuple attributes -tupleArray tupleNumber arrayName
-clear stores the values of the tuple in array arrayName, indexed
clear the result buffer. Do not reuse after this 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 int
Pg_result(ClientData cData, Tcl_Interp * interp, int argc, char *argv[]) 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[]) ...@@ -621,15 +632,24 @@ Pg_result(ClientData cData, Tcl_Interp * interp, int argc, char *argv[])
*/ */
for (tupno = 0; tupno < PQntuples(result); tupno++) for (tupno = 0; tupno < PQntuples(result); tupno++)
{ {
const char *field0 = PQgetvalue(result, tupno, 0); const char *field0 =
char * workspace = malloc(strlen(field0) + strlen(appendstr) + 210); #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++) for (i = 1; i < PQnfields(result); i++)
{ {
sprintf(workspace, "%s,%.200s%s", field0, PQfname(result,i), sprintf(workspace, "%s,%.200s%s", field0, PQfname(result,i),
appendstr); appendstr);
if (Tcl_SetVar2(interp, arrVar, workspace, if (Tcl_SetVar2(interp, arrVar, workspace,
#ifdef TCL_ARRAYS
tcl_value(PQgetvalue(result, tupno, i)),
#else
PQgetvalue(result, tupno, i), PQgetvalue(result, tupno, i),
#endif
TCL_LEAVE_ERR_MSG) == NULL) TCL_LEAVE_ERR_MSG) == NULL)
{ {
free(workspace); free(workspace);
...@@ -654,8 +674,15 @@ Pg_result(ClientData cData, Tcl_Interp * interp, int argc, char *argv[]) ...@@ -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); Tcl_AppendResult(interp, "argument to getTuple cannot exceed number of tuples - 1", 0);
return TCL_ERROR; 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++) for (i = 0; i < PQnfields(result); i++)
Tcl_AppendElement(interp, PQgetvalue(result, tupno, i)); Tcl_AppendElement(interp, PQgetvalue(result, tupno, i));
#endif
return TCL_OK; return TCL_OK;
} }
else if (strcmp(opt, "-tupleArray") == 0) else if (strcmp(opt, "-tupleArray") == 0)
...@@ -674,7 +701,11 @@ Pg_result(ClientData cData, Tcl_Interp * interp, int argc, char *argv[]) ...@@ -674,7 +701,11 @@ Pg_result(ClientData cData, Tcl_Interp * interp, int argc, char *argv[])
for (i = 0; i < PQnfields(result); i++) for (i = 0; i < PQnfields(result); i++)
{ {
if (Tcl_SetVar2(interp, argv[4], PQfname(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), PQgetvalue(result, tupno, i),
#endif
TCL_LEAVE_ERR_MSG) == NULL) TCL_LEAVE_ERR_MSG) == NULL)
return TCL_ERROR; return TCL_ERROR;
} }
...@@ -1302,7 +1333,13 @@ Pg_select(ClientData cData, Tcl_Interp * interp, int argc, char **argv) ...@@ -1302,7 +1333,13 @@ Pg_select(ClientData cData, Tcl_Interp * interp, int argc, char **argv)
Tcl_SetVar2(interp, argv[3], ".tupno", buffer, 0); Tcl_SetVar2(interp, argv[3], ".tupno", buffer, 0);
for (column = 0; column < ncols; column++) 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); Tcl_SetVar2(interp, argv[3], ".command", "update", 0);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment