ftp.nice.ch/pub/next/database/postgres-4.2/postgresLibs.NIHS.b.tar.gz#/postgresLibs.pkg/postgresLibs.tar.gz#/contrib/spog/spog.c

This is spog.c in view mode; [Download] [Up]

/*
 * spog (simple postgres query interface)
 *
 * spog.c,v 1.4 1993/04/01 19:34:51 aoki Exp
 *
 * $Log: spog.c,v
 *
 * Revision 2.3  1992/08/13  11:44:48  schoenw
 * options -x and -n added, postgres v4r0 support
 *
 * Revision 2.2  1992/05/27  14:50:54  schoenw
 * HAVE_XMALLOC define for some readline versions added
 *
 * Revision 2.1  1992/05/22  12:53:33  schoenw
 * this is the public release 1.0
 *
 * Revision 1.6  1992/05/22  12:46:00  schoenw
 * builtin-commands, help functions and completion added
 *
 * Revision 1.5  1992/04/13  09:29:59  schoenw
 * histfilename hardcoded
 *
 * Revision 1.4  1992/03/11  14:54:50  schoenw
 * filename '-' for stdin
 *
 * Revision 1.3  1992/03/09  15:38:11  schoenw
 * -f option added
 *
 * Revision 1.2  1992/01/30  14:18:21  schoenw
 * old option -q removed
 *
 * Revision 1.1  1992/01/24  16:46:18  schoenw
 * Initial revision
 *
 */

#include "spog.h"

bool verbose = false;  /* be verbose -- return the no. of tuples fetched */
bool silent = false;   /* silence -- return only the status of the query */
bool print = false;    /* print -- print commands before execution */
bool norc = false;     /* norc -- dont read the initialization file */
char *progname;        /* the name of the game */
char *histfilename;    /* name of the current history file */
char *database;        /* name of the current database */

/* 
 * These symbols are referenced  by the new readline library.
 * So here they are.
 */

#ifdef NEED_XMALLOC

char *xmalloc (n)
int n;
{
        return malloc (n);
}

char *xrealloc (s, n)
char *s;
int n;
{
        return realloc (s, n);
}
#endif

#ifdef NEED_STRDUP
/*
 * SunOS [45], OSF/1, HP-UX all have strdup.
 * Some other UNIXes (namely Ultrix) don't.
 */
char *strdup(s)
char *s;
{
	char *news;

	if (!s)
		return((char *) NULL);
	if (!(news = malloc(strlen(s) + 1)))
		return((char *) NULL);
	return(strcpy(news, s));
}
#endif

/*
 * Strip whitespace from the start and end of a string.
 */

stripwhite (string)
char *string;
{
	register int i = 0;
	
	if (!string) return;
	
	while (whitespace (string[i]))
		i++;
	
	if (i)
		strcpy (string, string + i);
	
	i = strlen (string) - 1;
	
	while (i > 0 && whitespace (string[i]))
		i--;
	
	string[++i] = '\0';
}

/*
 * open and close a history file
 */

char *
open_history()
{
	char *fn;

	if (! (fn = malloc(255))) {
                fprintf (stderr, "%s: malloc failed", progname);
                exit (1);
        }

        strcpy (fn, getenv("HOME"));
        strcat (fn, "/.");
        strcat (fn, progname);
        strcat (fn, "_");
        strcat (fn, database);

	(void) read_history (fn);

	return fn;
}

void
close_history()
{
	stifle_history(HISTSIZE);
	
	if (write_history(histfilename))
		fprintf (stderr, "%s: error writing %s\n", 
			 progname, histfilename);
}

/*
 * get the commands from a file and process them
 */

query_from_file(file)
FILE *file;
{

	char c;
	char QUERY[MAXQUERYSIZE];
	int i = 0;
	int skip = false;

	while ((c = getc(file)) != EOF) {
		switch (c) {
		case '\n':
			QUERY[i]='\0';
			if (strlen(QUERY) > 0) {
				do_it(QUERY);
			}
			skip = false;
			i = 0;
			break;
		case '#':
			skip = true;
			break;
		default:
			if (skip) break;
			if (i == 0 && isspace(c)) break;
			QUERY[i++] = c;
			if (i == MAXQUERYSIZE)
				printf (stderr,"%s: query too long\n", progname);
		}
	}
}

/*
 * get the commands using readline and process them
 */

query_from_readline()
{
	char *line = NULL;
	char prompt[80];

	sprintf(prompt, "%s > ", progname);
	printf("connected to backend ");
	if (PQhost) printf("on %s ", PQhost);
	if (PQport) printf("port %s ", PQport);
	printf("database %s\n", database);

	initialize_readline();
	
	using_history ();

	histfilename = open_history();
	
	while (1)
	{
		if (line != (char *)NULL)
			free (line);
		
		line = readline (prompt);

		stripwhite (line);

		if (line && *line) {
			do_it(line);
			add_history (line);
		}

		if (!line) {
			printf ("\n");
			break;
		}

		if (!strcmp(line,"exit"))
			break;

		if (!strcmp(line,"quit"))
			break;
	}

	close_history();
}

/*
 * execute commands in $HOME/.spogrc
 */

read_spogrc()
{
	char *home, *filename;
	FILE *file;

	if ((home = getenv("HOME")) != NULL) {
		if (filename = malloc(strlen(home)+10)) {
			strcpy(filename,home);
			strcat(filename,"/.spogrc");

			if ((file = fopen(filename,"r")) == NULL) {
				return;
			}
			
			if (verbose) printf ("reading %s\n", filename);

			query_from_file (file);
			fclose (file);
		}
	}
}

/*
 * execute commands in a given file filename
 */

read_file(filename)
char *filename;
{
	FILE *file;

	if (!strcmp(filename,"-")) {
		file = stdin;
	} else {
		if ((file = fopen(filename,"r")) == NULL) {
			fprintf(stderr, "%s: can't open %s\n", 
				progname, filename);
			return;
		}
	}

	query_from_file (file);
	
        if (file != stdin) fclose(file);
}

/*
 * here we start
 */

main(argc,argv)
int argc;
char **argv;
{
	char *filename = NULL;
	char *query = NULL;

	int c;
	int errflg = 0;

	if ((progname = rindex(argv[0], '/')) == NULL)
		progname = argv[0];
	else
		progname++;

	while ((c = getopt(argc,argv,"h:p:c:f:vsxn?")) != EOF) {
		switch (c) {
		case 'h':
			PQhost = optarg;
			break;
		case 'p':
			PQport = optarg;

			break;
		case 'c':
			query = optarg;
			break;
		case 'f':
			filename = optarg;
			break;
		case 'v':
			verbose = true;
			break;
		case 's':
			silent = true;
			break;
		case 'x':
			print = true;
			break;
		case 'n':
			norc = true;
			break;
		case '?':
			errflg++;
		}
	}

	if (errflg) {
		fprintf(stderr, "usage: %s [-h host] [-p port] [-c query] [-f file] [-s] [-v] [-x] [-n] database\n", progname);
		exit (2);
	}

	/* find default database */
	if ((database = argv[optind]) == NULL)
		if ((database = getenv("PGDATABASE")) == NULL) {
			if ((database = getenv("USER")) == NULL) {
				database = "template1";
			};
			printf ("Warning: Assuming database %s\n",database);
		}
	
	PQsetdb(database);

	/* first process the $HOME/.spogrc */
	if (!norc) read_spogrc();

	/* process a single query */
	if (query) {
		do_it(query);
		PQfinish();
		exit (0);
	}

	/* process queries from a file */
	if (filename) {
		read_file(filename);
		PQfinish();
		exit (0);
	}

	/* ok, we are interactive -- that's where the fun beginns */
	query_from_readline();
	PQfinish();
	exit (0);

}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.