mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-02-11 19:20:40 +08:00
TCL_ARRAYS option patches from Massimo Dal Zotto
This commit is contained in:
parent
f134a1a90a
commit
5d2cf6af9e
src
@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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[])
|
|||||||
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[])
|
|||||||
*/
|
*/
|
||||||
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[])
|
|||||||
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[])
|
|||||||
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)
|
|||||||
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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user