This is query.c in view mode; [Download] [Up]
/*
* postgres part of spog
*
* query.c,v 1.2 1993/06/14 21:24:07 aoki Exp
*
* $Log: query.c,v
* Revision 2.2 1992/08/13 11:44:48 schoenw
* options -x and -n added, postgres v4r0 support
*
* Revision 2.1 1992/05/22 12:53:33 schoenw
* this is the public release 1.0
*
* Revision 1.1 1992/05/22 12:46:00 schoenw
* Initial revision
*
*/
#include "spog.h"
struct FMT_NODE *att_fmt = NULL; /* formats used to print an attribute */
struct FMT_NODE *type_fmt = NULL; /* format used to print a specific type */
char *default_fmt = " %-12s"; /* separator printed at the end of a tupel */
char *separator = "\n"; /* separator printed at the end of a tupel */
char querybuffer[MAXQUERYSIZE] = "";
int query_continues = 0;
/*
*
*/
print_value (name, value, type)
char *name, *value;
int type;
{
char *fmt = NULL;
struct FMT_NODE *p = att_fmt;
while (p) {
if (!strcmp(p -> name, name)) {
fmt = p -> fmt;
break;
}
p = p -> next;
}
if (fmt == NULL) {
p = type_fmt;
while (p) {
if (p -> oid == type ) {
fmt = p -> fmt;
break;
}
p = p -> next;
}
}
if (fmt == NULL) {
printf(default_fmt, value);
} else {
printf(fmt, value);
}
}
/*
* This is the routine that prints out the tuples that
* are returned from the backend.
*/
print_tuples (pname)
char *pname;
{
PortalBuffer *p;
int i,j,k,g,m,n;
int t=0;
int total=0;
/* Now to examine all tuples fetched. */
p = PQparray(pname);
g = PQngroups (p);
if (verbose) {
for (i=0; i<g; i++) total += PQntuplesGroup(p,i);
printf ("Your query returned %d tuples ",total);
}
if (silent) {
if (verbose) printf("\n");
return;
}
for (k = 0; k < g; k++) {
n = PQntuplesGroup(p, k);
m = PQnfieldsGroup(p, k);
if ( m > 0 ) { /* only print tuples with at least 1 field. */
if (verbose) {
/* Print out the attribute names */
printf("(");
for (i=0; i < m; i++)
printf(" %s",PQfnameGroup(p,k,i));
printf(" ):\n");
}
/* Print out the tuples */
for (i = 0; i < n; i++) {
for(j = 0; j < m; j++) {
print_value(PQfnameGroup(p,k,j),
PQgetvalue(p,t+i,j),
PQftype(p,t+i,j));
}
printf(separator);
}
t += n;
}
}
}
/*
* process a query
*/
do_query(query)
char *query;
{
bool done = false;
int nqueries = 0;
char *ret_string;
char *result;
char ret_val;
int len;
if ((len = strlen(query)) == 0)
return;
if (len + strlen(querybuffer) > MAXQUERYSIZE) {
fprintf (stderr, "error: query buffer overflow\n");
querybuffer[0] = '\0';
query_continues = 0;
return;
}
strcat(querybuffer, query);
if (query[len-1] == '\\') {
querybuffer[strlen(querybuffer)-1] = ' ';
query_continues = 1;
return;
}
#ifdef DEBUG
printf("query: %s\n", querybuffer);
#endif
result = PQexec(querybuffer);
querybuffer[0] = '\0';
query_continues = 0;
while (!done) {
ret_val = result[0];
ret_string = &result[1];
#ifdef DEBUG
printf("query result: %s\n", result);
#endif
switch (ret_val) {
case 'A':
case 'P':
print_tuples(ret_string);
PQclear(ret_string);
result = PQexec(" ");
nqueries++;
break;
case 'E':
PQreset();
done = true;
fputs("spog: detected a fatal error, exiting...\n",
stderr),
exit(2); /* XXX */
case 'R':
PQreset();
done = true;
break;
case 'C':
printf("%s successful\n", ret_string);
result = PQexec(" ");
nqueries++;
break;
case 'I':
PQFlushI(nqueries - 1);
done = true;
break;
default:
fprintf(stderr, "error: type %c: %s\n",
ret_val, ret_string);
break;
}
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.