diff options
author | Marc G. Fournier <scrappy@hub.org> | 1996-07-23 03:13:58 +0000 |
---|---|---|
committer | Marc G. Fournier <scrappy@hub.org> | 1996-07-23 03:13:58 +0000 |
commit | 668aa24fc495a142fdf2ac12b32d849a04b21dc0 (patch) | |
tree | f281c2ddfcf5cc9936c38ac9a8c4aef022e41fab /src/extend/pginsert | |
parent | 772ae267e36f15136d900f560517835ac833840a (diff) | |
download | postgresql-668aa24fc495a142fdf2ac12b32d849a04b21dc0.tar.gz postgresql-668aa24fc495a142fdf2ac12b32d849a04b21dc0.zip |
More merge's from Dr. George's sourec tree
Diffstat (limited to 'src/extend/pginsert')
-rw-r--r-- | src/extend/pginsert/Makefile | 19 | ||||
-rw-r--r-- | src/extend/pginsert/halt.c | 58 | ||||
-rw-r--r-- | src/extend/pginsert/halt.h | 7 | ||||
-rw-r--r-- | src/extend/pginsert/pginsert.c | 98 | ||||
-rw-r--r-- | src/extend/pginsert/pginterface.c | 154 | ||||
-rw-r--r-- | src/extend/pginsert/pginterface.h | 12 |
6 files changed, 348 insertions, 0 deletions
diff --git a/src/extend/pginsert/Makefile b/src/extend/pginsert/Makefile new file mode 100644 index 00000000000..7759ef8d28f --- /dev/null +++ b/src/extend/pginsert/Makefile @@ -0,0 +1,19 @@ +# +# Makefile +# +# +TARGET = pginsert +CFLAGS = -g -Wall -I/u/postgres95/include +LIBS = -L/u/postgres95/lib -lpq + +$(TARGET) : pginsert.o pginterface.o halt.o + $(CC) -o $(TARGET) $(XFLAGS) $(CFLAGS) \ + pginsert.o pginterface.o halt.o $(LIBS) + +clean: + rm -f *.o $(TARGET) log core + +install: + make clean + make CFLAGS=-O + install -s -o bin -g bin $(TARGET) /usr/local/bin diff --git a/src/extend/pginsert/halt.c b/src/extend/pginsert/halt.c new file mode 100644 index 00000000000..58ca11a5878 --- /dev/null +++ b/src/extend/pginsert/halt.c @@ -0,0 +1,58 @@ +/* +** +** halt.c +** +** This is used to print out error messages and exit +*/ + +#include <varargs.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> + + +/*------------------------------------------------------------------------- +** +** halt - print error message, and call clean up routine or exit +** +**------------------------------------------------------------------------*/ + +/*VARARGS*/ +void halt(va_alist) +va_dcl +{ + va_list arg_ptr; + char *format, *pstr; + void (*sig_func)(); + + va_start(arg_ptr); + format = va_arg(arg_ptr,char *); + if (strncmp(format,"PERROR", 6) != 0) + vfprintf(stderr,format,arg_ptr); + else + { + for (pstr=format+6; *pstr == ' ' || *pstr == ':'; pstr++) + ; + vfprintf(stderr,pstr,arg_ptr); + perror(""); + } + va_end(arg_ptr); + fflush(stderr); + + /* call one clean up function if defined */ + if ( (sig_func = signal(SIGTERM, SIG_DFL)) != SIG_DFL && + sig_func != SIG_IGN) + (*sig_func)(0); + else if ( (sig_func = signal(SIGHUP, SIG_DFL)) != SIG_DFL && + sig_func != SIG_IGN) + (*sig_func)(0); + else if ( (sig_func = signal(SIGINT, SIG_DFL)) != SIG_DFL && + sig_func != SIG_IGN) + (*sig_func)(0); + else if ( (sig_func = signal(SIGQUIT, SIG_DFL)) != SIG_DFL && + sig_func != SIG_IGN) + (*sig_func)(0); + exit(1); +} diff --git a/src/extend/pginsert/halt.h b/src/extend/pginsert/halt.h new file mode 100644 index 00000000000..cb4ea545b9b --- /dev/null +++ b/src/extend/pginsert/halt.h @@ -0,0 +1,7 @@ +/* +** halt.h +** +*/ + +void halt(); + diff --git a/src/extend/pginsert/pginsert.c b/src/extend/pginsert/pginsert.c new file mode 100644 index 00000000000..eb732c69309 --- /dev/null +++ b/src/extend/pginsert/pginsert.c @@ -0,0 +1,98 @@ +/* + * insert.c + * +*/ + +#include <stdio.h> +#include <signal.h> +#include <time.h> +#include <halt.h> +#include <libpq-fe.h> +#include "pginterface.h" + +int main(int argc, char **argv) +{ + char query[4000]; + int row =1; + int aint; + float afloat; + double adouble; + char achar[11], achar16[17], abpchar[11], avarchar[51], atext[51]; + time_t aabstime; + + if (argc != 2) + halt("Usage: %s database\n",argv[0]); + + connectdb(argv[1],NULL,NULL,NULL,NULL); + + skip_query_errors = 1; + doquery("DROP TABLE testfetch"); + skip_query_errors = 0; + + doquery("\ + CREATE TABLE testfetch( \ + aint int4, \ + afloat float4, \ + adouble float8, \ + achar char, \ + achar16 char16, \ + abpchar char(10), \ + avarchar varchar(50), \ + atext text, \ + aabstime abstime) \ + "); + + while(1) + { + sprintf(query,"INSERT INTO testfetch VALUES ( \ + %d, \ + 2322.12, \ + '923121.0323'::float8, \ + 'A', \ + 'Betty', \ + 'Charley', \ + 'Doug', \ + 'Ernie', \ + 'now' )", row); + doquery(query); + + doquery("BEGIN WORK"); + doquery("DECLARE c_testfetch BINARY CURSOR FOR \ + SELECT * FROM testfetch"); + + doquery("FETCH ALL IN c_testfetch"); + + while (fetch( + &aint, + &afloat, + &adouble, + achar, + achar16, + abpchar, + avarchar, + atext, + &aabstime) != END_OF_TUPLES) + printf("int %d\nfloat %f\ndouble %f\nchar %s\nchar16 %s\n\ +bpchar %s\nvarchar %s\ntext %s\nabstime %s", + aint, + afloat, + adouble, + achar, + achar16, + abpchar, + avarchar, + atext, + ctime(&aabstime)); + + + doquery("CLOSE c_testfetch"); + doquery("COMMIT WORK"); + printf("--- %-d rows inserted so far\n",row); + + row++; + } + + disconnectdb(); + return 0; +} + diff --git a/src/extend/pginsert/pginterface.c b/src/extend/pginsert/pginterface.c new file mode 100644 index 00000000000..3b5ddf05f2c --- /dev/null +++ b/src/extend/pginsert/pginterface.c @@ -0,0 +1,154 @@ +/* + * pginterface.c + * +*/ + +#include <stdio.h> +#include <string.h> +#include <signal.h> +#include <stdarg.h> + +#include <halt.h> +#include <libpq-fe.h> +#include "pginterface.h" + +static void sig_disconnect(); +static void set_signals(); + +#define NUL '\0' + +/* GLOBAL VARIABLES */ +static PGconn* conn; +static PGresult* res = NULL; +int skip_query_errors = 0; + +/* LOCAL VARIABLES */ +static sigset_t block_sigs, unblock_sigs; +static int tuple; + +/* +** +** connectdb - returns PGconn structure +** +*/ +PGconn *connectdb( char *dbName, + char *pghost, + char *pgport, + char *pgoptions, + char *pgtty) +{ + /* make a connection to the database */ + conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName); + if (PQstatus(conn) == CONNECTION_BAD) + halt("Connection to database '%s' failed.\n%s\n", dbName, + PQerrorMessage(conn)); + set_signals(); + return conn; +} + +/* +** +** disconnectdb +** +*/ +void disconnectdb() +{ + PQfinish(conn); +} + +/* +** +** doquery - returns PGresult structure +** +*/ +PGresult *doquery(char *query) +{ + if (res != NULL) + PQclear(res); + + sigprocmask(SIG_SETMASK,&block_sigs,NULL); + res = PQexec(conn, query); + sigprocmask(SIG_SETMASK,&unblock_sigs,NULL); + + if (skip_query_errors == 0 && + (res == NULL || + PQresultStatus(res) == PGRES_BAD_RESPONSE || + PQresultStatus(res) == PGRES_NONFATAL_ERROR || + PQresultStatus(res) == PGRES_FATAL_ERROR)) + { + if (res != NULL) + fprintf(stderr,"query error: %s\n",PQcmdStatus(res)); + else fprintf(stderr,"connection error: %s\n",PQerrorMessage(conn)); + PQfinish(conn); + halt("failed request: %s\n", query); + } + tuple = 0; + return res; +} + +/* +** +** fetch - returns tuple number (starts at 0), or the value END_OF_TUPLES +** NULL pointers are skipped +** +*/ +int fetch(void *param, ...) +{ + va_list ap; + int arg, num_args; + + num_args = PQnfields(res); + + if (tuple >= PQntuples(res)) + return END_OF_TUPLES; + va_start(ap, param); + for (arg = 0; arg < num_args; arg++) + { + if (param != NULL) + { + if (PQfsize(res, arg) == -1) + { + memcpy(param,PQgetvalue(res,tuple,arg),PQgetlength(res,tuple,arg)); + ((char *)param)[PQgetlength(res,tuple,arg)] = NUL; + } + else + memcpy(param,PQgetvalue(res,tuple,arg),PQfsize(res,arg)); + } + param = va_arg(ap, char *); + } + va_end(ap); + return tuple++; +} + +/* +** +** sig_disconnect +** +*/ +static void sig_disconnect() +{ + fprintf(stderr,"exiting...\n"); + PQfinish(conn); + exit(1); +} + +/* +** +** set_signals +** +*/ +static void set_signals() +{ + sigemptyset(&block_sigs); + sigemptyset(&unblock_sigs); + sigaddset(&block_sigs,SIGTERM); + sigaddset(&block_sigs,SIGHUP); + sigaddset(&block_sigs,SIGINT); +/* sigaddset(&block_sigs,SIGQUIT); no block */ + sigprocmask(SIG_SETMASK,&unblock_sigs,NULL); + signal(SIGTERM,sig_disconnect); + signal(SIGHUP,sig_disconnect); + signal(SIGINT,sig_disconnect); + signal(SIGQUIT,sig_disconnect); +} + diff --git a/src/extend/pginsert/pginterface.h b/src/extend/pginsert/pginterface.h new file mode 100644 index 00000000000..a84d5194116 --- /dev/null +++ b/src/extend/pginsert/pginterface.h @@ -0,0 +1,12 @@ +/* + * pglib.h + * +*/ + +PGresult *doquery(char *query); +PGconn *connectdb(); +void disconnectdb(); +int fetch(void *param, ...); +int skip_query_errors; + +#define END_OF_TUPLES (-1) |