ZM handling. Log trimmed.

git-svn-id: http://svn.osgeo.org/postgis/trunk@949 b70326c6-7e19-0410-871a-916f4a2858ee
This commit is contained in:
Sandro Santilli 2004-10-06 17:04:38 +00:00
parent 8c9c80a9ac
commit 3e092d28c7

View file

@ -63,7 +63,8 @@ DBFHandle dbf;
SHPHandle shp;
int geotype;
int outshptype;
char outdims;
char outtype;
int dswitchprovided;
int includegid;
int unescapedattrs;
int binary;
@ -75,12 +76,13 @@ int pgis_major_version;
int getMaxFieldSize(PGconn *conn, char *schema, char *table, char *fname);
int parse_commandline(int ARGC, char **ARGV);
void usage(int exitstatus);
char *getTableOID(char *table);
char *getTableOID(char *schema, char *table);
int addRecord(PGresult *res, int residx, int row);
int initShapefile(char *shp_file, PGresult *res);
int initialize(void);
int getGeometryOID(PGconn *conn);
int getGeometryType(char *schema, char *table, char *geo_col_name);
int getGeometryDims(char *schema, char *table, char *geo_col_name);
char *shapetypename(int num);
int parse_points(char *str, int num_points, double *x,double *y,double *z);
int num_points(char *str);
@ -148,7 +150,8 @@ main(int ARGC, char **ARGV){
shp_file = NULL;
main_scan_query = NULL;
rowbuflen=100;
outdims = 's';
outtype = 's';
dswitchprovided = 0;
includegid=0;
unescapedattrs=0;
binary = 0;
@ -171,7 +174,7 @@ main(int ARGC, char **ARGV){
/* Make a connection to the specified database, and exit on failure */
conn = PQconnectdb("");
if (PQstatus(conn) == CONNECTION_BAD) {
fprintf(stderr, "%s", PQerrorMessage(conn));
printf( "%s", PQerrorMessage(conn));
exit_nicely(conn);
}
@ -187,6 +190,12 @@ main(int ARGC, char **ARGV){
fprintf(stdout, "Done (postgis major version: %d).\n",
pgis_major_version);
if ( pgis_major_version > 0 && dswitchprovided )
{
printf("WARNING: -d switch is useless when dumping from postgis-1.0.0+\n");
}
printf("Output shape type is: %s\n", shapetypename(outshptype));
@ -196,7 +205,7 @@ main(int ARGC, char **ARGV){
*/
res=PQexec(conn, "BEGIN");
if ( ! res || PQresultStatus(res) != PGRES_COMMAND_OK ) {
fprintf(stderr, "%s", PQerrorMessage(conn));
printf( "%s", PQerrorMessage(conn));
exit_nicely(conn);
}
PQclear(res);
@ -212,11 +221,13 @@ main(int ARGC, char **ARGV){
} else {
sprintf(query, "DECLARE cur CURSOR FOR %s", main_scan_query);
}
//fprintf(stderr, "MAINSCAN: %s\n", main_scan_query);
#if VERBOSE > 2
printf( "MAINSCAN: %s\n", main_scan_query);
#endif
res = PQexec(conn, query);
free(query);
if ( ! res || PQresultStatus(res) != PGRES_COMMAND_OK ) {
fprintf(stderr, "%s", PQerrorMessage(conn));
printf( "MainScanQuery: %s", PQerrorMessage(conn));
exit_nicely(conn);
}
PQclear(res);
@ -239,7 +250,8 @@ main(int ARGC, char **ARGV){
#endif
res = PQexec(conn, fetchquery);
if ( ! res || PQresultStatus(res) != PGRES_TUPLES_OK ) {
fprintf(stderr, "%s", PQerrorMessage(conn));
printf( "RecordFetch: %s",
PQerrorMessage(conn));
exit_nicely(conn);
}
@ -293,7 +305,7 @@ shape_creator_wrapper_WKB(byte *str, int idx)
wkb_big_endian = ! popbyte(&ptr);
if ( wkb_big_endian != big_endian )
{
fprintf(stderr, "Wrong WKB endiannes, dunno how to flip\n");
printf( "Wrong WKB endiannes, dunno how to flip\n");
exit(1);
}
@ -357,7 +369,7 @@ shape_creator_wrapper_WKB(byte *str, int idx)
return create_multipoint4D_WKB(str);
default:
fprintf(stderr, "Unknown WKB type (%8.8lx) - (%s:%d)\n",
printf( "Unknown WKB type (%8.8lx) - (%s:%d)\n",
type, __FILE__, __LINE__);
return NULL;
}
@ -930,12 +942,12 @@ create_point3D_WKB(byte *wkb)
}
else if ( geotype == MULTIPOINTTYPE )
{
//fprintf(stderr, "create_point3D_WKB: fluffing to MULTIPOINT\n");
//printf( "create_point3D_WKB: fluffing to MULTIPOINT\n");
obj = SHPCreateSimpleObject(outshptype, 1, &x, &y, &z);
}
else
{
fprintf(stderr, "ERROR: create_point2D_WKB called with wrong geometry type (%d)\n", geotype);
printf( "ERROR: create_point2D_WKB called with wrong geometry type (%d)\n", geotype);
return NULL;
}
@ -1736,13 +1748,13 @@ getGeometryOID(PGconn *conn)
res1=PQexec(conn, "select OID from pg_type where typname = 'geometry'");
if ( ! res1 || PQresultStatus(res1) != PGRES_TUPLES_OK )
{
fprintf(stderr, "OID query error: %s", PQerrorMessage(conn));
printf( "OIDQuery: %s", PQerrorMessage(conn));
return -1;
}
if(PQntuples(res1) <= 0 )
{
fprintf(stderr, "Geometry type unknown "
printf( "Geometry type unknown "
"(have you enabled postgis?)\n");
return -1;
}
@ -1812,7 +1824,7 @@ fprintf(stdout, "s"); fflush(stdout);
obj=SHPCreateSimpleObject(SHPT_NULL,0,NULL,NULL,NULL);
if ( SHPWriteObject(shp,-1,obj) == -1)
{
fprintf(stderr,
printf(
"Error writing null shape %d\n", row);
SHPDestroyObject(obj);
return 0;
@ -1851,13 +1863,13 @@ fprintf(stdout, "s"); fflush(stdout);
obj = shape_creator_wrapper_WKB(val, row);
if ( ! obj )
{
fprintf(stderr, "Error creating shape for record %d "
printf( "Error creating shape for record %d "
"(geotype is %d)\n", row, geotype);
return 0;
}
if ( SHPWriteObject(shp,-1,obj) == -1)
{
fprintf(stderr, "Error writing shape %d\n", row);
printf( "Error writing shape %d\n", row);
SHPDestroyObject(obj);
return 0;
}
@ -1877,36 +1889,48 @@ fprintf(stdout, "s"); fflush(stdout);
* Return allocate memory. Free after use.
*/
char *
getTableOID(char *table)
getTableOID(char *schema, char *table)
{
PGresult *res3;
char *query;
char *ret;
size_t size;
size = strlen(table)+256;
if ( schema ) size += strlen(schema)+1;
query = (char *)malloc(size);
if ( schema )
{
sprintf(query, "SELECT oid FROM pg_class c, pg_namespace n WHERE c.relnamespace n.oid AND n.nspname = '%s' AND c.relname = '%s'", schema, table);
} else {
sprintf(query, "SELECT oid FROM pg_class WHERE relname = '%s'", table);
}
query = (char *)malloc(strlen(table)+256);
sprintf(query, "SELECT oid FROM pg_class WHERE relname = '%s'", table);
res3 = PQexec(conn, query);
free(query);
if ( ! res3 || PQresultStatus(res3) != PGRES_TUPLES_OK ) {
fprintf(stderr, "%s", PQerrorMessage(conn));
printf( "TableOID: %s", PQerrorMessage(conn));
exit_nicely(conn);
}
if(PQntuples(res3) == 1 ){
ret = strdup(PQgetvalue(res3, 0, 0));
}else if(PQntuples(res3) == 0 ){
fprintf(stderr, "ERROR: Cannot determine relation OID.\n");
printf( "Cannot find relation OID (does table exist?).\n");
return NULL;
}else{
ret = strdup(PQgetvalue(res3, 0, 0));
fprintf(stderr, "Warning: Multiple relations detected, the program will only dump the first relation.\n");
printf( "Warning: Multiple relations detected, the program will only dump the first relation.\n");
}
return ret;
}
/*
* Return geometry type as defined at top file.
* Return -1 on error
* Return 0 on unknown or unsupported geometry type
* Return -1 on error.
* Return 0 on unknown or unsupported geometry type.
* Set outtype to 'm' or 'z' depending on input type.
*/
int
getGeometryType(char *schema, char *table, char *geo_col_name)
@ -1920,7 +1944,10 @@ getGeometryType(char *schema, char *table, char *geo_col_name)
int foundsingle=0;
int i;
//get what kind of Geometry type is in the table
/**************************************************
* Get what kind of Geometry type is in the table
**************************************************/
if ( schema )
{
sprintf(query, "SELECT DISTINCT geometrytype(\"%s\") "
@ -1934,10 +1961,12 @@ getGeometryType(char *schema, char *table, char *geo_col_name)
geo_col_name, table, geo_col_name);
}
//printf("\n\n-->%s\n\n",query);
#if VERBOSE > 2
printf( "%s\n",query);
#endif
res = PQexec(conn, query);
if ( ! res || PQresultStatus(res) != PGRES_TUPLES_OK ) {
fprintf(stderr, "%s", PQerrorMessage(conn));
printf( "GeometryType: %s", PQerrorMessage(conn));
return -1;
}
@ -1965,7 +1994,7 @@ getGeometryType(char *schema, char *table, char *geo_col_name)
{
if ( basetype && basetype != LINETYPE )
{
fprintf(stderr, "ERROR: uncompatible mixed geometries in table\n");
printf( "ERROR: uncompatible mixed geometry types in table\n");
return -1;
}
basetype = LINETYPE;
@ -1975,7 +2004,7 @@ getGeometryType(char *schema, char *table, char *geo_col_name)
{
if ( basetype && basetype != POLYGONTYPE )
{
fprintf(stderr, "ERROR: uncompatible mixed geometries in table\n");
printf( "ERROR: uncompatible mixed geometries in table\n");
return -1;
}
basetype = POLYGONTYPE;
@ -1985,7 +2014,7 @@ getGeometryType(char *schema, char *table, char *geo_col_name)
{
if ( basetype && basetype != POINTTYPE )
{
fprintf(stderr, "ERROR: uncompatible mixed geometries in table\n");
printf( "ERROR: uncompatible mixed geometries in table\n");
return -1;
}
basetype = POINTTYPE;
@ -1993,14 +2022,24 @@ getGeometryType(char *schema, char *table, char *geo_col_name)
}
else
{
fprintf(stderr, "type '%s' is not Supported at this time.\n",
printf( "type '%s' is not Supported at this time.\n",
geo_str);
fprintf(stderr, "The DBF file will be created but not the shx "
printf( "The DBF file will be created but not the shx "
"or shp files.\n");
return 0;
}
}
PQclear(res);
/**************************************************
* Get Geometry dimensions (2d/3dm/3dz/4d)
**************************************************/
if ( pgis_major_version > 0 )
if ( -1 == getGeometryDims(schema, table, geo_col_name) )
return -1;
if ( foundmulti )
return multitype;
else
@ -2008,6 +2047,69 @@ getGeometryType(char *schema, char *table, char *geo_col_name)
}
/*
* Set global outtype variable to:
* 'm' for 3dm input
* 'z' for 3dz or 4d input
* 's' for 2d
* Return -1 on error, 0 on success.
* Call only on postgis >= 1.0.0
*/
int
getGeometryDims(char *schema, char *table, char *geo_col_name)
{
char query[1024];
PGresult *res;
int zmflag;
if ( schema )
{
sprintf(query, "SELECT max(zmflag(\"%s\")) "
"FROM \"%s\".\"%s\"",
geo_col_name, schema, table);
}
else
{
sprintf(query, "SELECT max(zmflag(\"%s\")) "
"FROM \"%s\"",
geo_col_name, table);
}
#if VERBOSE > 2
printf("%s\n",query);
#endif
res = PQexec(conn, query);
if ( ! res || PQresultStatus(res) != PGRES_TUPLES_OK ) {
printf( "ZMflagQuery: %s", PQerrorMessage(conn));
return -1;
}
if (PQntuples(res) == 0)
{
printf("ERROR: Cannot determine geometry dimensions (empty table).\n");
return -1;
}
zmflag = atoi(PQgetvalue(res, 0, 0));
PQclear(res);
switch (zmflag)
{
case 0:
outtype = 's';
break;
case 1:
outtype = 'm';
break;
default:
outtype = 'z';
break;
}
return 0;
}
void
usage(status)
{
@ -2015,9 +2117,6 @@ usage(status)
printf("USAGE: pgsql2shp [<options>] <database> [<schema>.]<table>\n");
printf("\n");
printf("OPTIONS:\n");
printf(" (-m|z) Output type modifiers (default is XY):\n");
printf(" -m Set to XYM\n");
printf(" -z Set to XYMZ (-d accepted for backward compatibility)\n");
printf(" -f <filename> Use this option to specify the name of the file\n");
printf(" to create.\n");
printf(" -h <host> Allows you to specify connection to a database on a\n");
@ -2043,7 +2142,7 @@ int parse_commandline(int ARGC, char **ARGV)
buf[255] = '\0'; // just in case...
/* Parse command line */
while ((c = getopt(ARGC, ARGV, "bf:h:dmzu:p:P:g:r")) != EOF){
while ((c = getopt(ARGC, ARGV, "bf:h:du:p:P:g:r")) != EOF){
switch (c) {
case 'b':
binary = 1;
@ -2057,11 +2156,8 @@ int parse_commandline(int ARGC, char **ARGV)
putenv(strdup(buf));
break;
case 'd':
case 'z':
outdims = 'z';
break;
case 'm':
outdims = 'm';
dswitchprovided = 1;
outtype = 'z';
break;
case 'r':
includegid = 1;
@ -2122,8 +2218,9 @@ get_postgis_major_version()
res = PQexec(conn, query);
if ( ! res || PQresultStatus(res) != PGRES_TUPLES_OK ) {
fprintf(stderr, "Can't detect postgis version:\n");
fprintf(stderr, "%s", PQerrorMessage(conn));
printf( "Can't detect postgis version:\n");
printf( "PostgisVersionQuery: %s",
PQerrorMessage(conn));
exit(1);
}
@ -2185,15 +2282,18 @@ initialize()
/* Exec query */
//fprintf(stderr, "Attribute query:\n%s\n", query);
#if VERBOSE > 2
printf( "Attribute query: %s\n", query);
#endif
res = PQexec(conn, query);
free(query);
if ( ! res || PQresultStatus(res) != PGRES_TUPLES_OK ) {
fprintf(stderr, "%s", PQerrorMessage(conn));
printf( "Querying for attributes: %s",
PQerrorMessage(conn));
return 0;
}
if (! PQntuples(res)) {
fprintf(stderr, "Table %s does not exist\n", table);
printf( "Table %s does not exist\n", table);
PQclear(res);
return 0;
}
@ -2201,7 +2301,7 @@ initialize()
/* Create the dbf file */
dbf = DBFCreate(shp_file);
if ( ! dbf ) {
fprintf(stderr, "Could not create dbf file\n");
printf( "Could not create dbf file\n");
return 0;
}
@ -2230,7 +2330,7 @@ initialize()
type = atoi(PQgetvalue(res, i, 1));
size = atoi(PQgetvalue(res, i, 2));
//fprintf(stderr, "A: %s, T: %d, S: %d\n", fname, type, size);
//printf( "A: %s, T: %d, S: %d\n", fname, type, size);
/*
* This is a geometry column
*/
@ -2334,7 +2434,7 @@ initialize()
{
if(DBFAddField(dbf, field_name,FTInteger,16,0) == -1)
{
fprintf(stderr, "error - Field could not "
printf( "error - Field could not "
"be created.\n");
return 0;
}
@ -2348,7 +2448,7 @@ initialize()
{
if(DBFAddField(dbf, field_name,FTDouble,32,10) == -1)
{
fprintf(stderr, "error - Field could not "
printf( "error - Field could not "
"be created.\n");
return 0;
}
@ -2385,12 +2485,12 @@ initialize()
if ( size == -1 ) return 0;
if ( ! size ) size = 32; // might 0 be a good size ?
}
//fprintf(stderr, "FIELD_NAME: %s, SIZE: %d\n", field_name, size);
//printf( "FIELD_NAME: %s, SIZE: %d\n", field_name, size);
/* generic type (use string representation) */
if(DBFAddField(dbf, field_name,FTString,size,0) == -1)
{
fprintf(stderr, "error - Field could not "
printf( "error - Field could not "
"be created.\n");
return 0;
}
@ -2406,12 +2506,12 @@ initialize()
{
if ( geo_col_name )
{
fprintf(stderr, "%s: no such attribute in table %s\n",
printf( "%s: no such attribute in table %s\n",
geo_col_name, table);
return 0;
}
fprintf(stderr, "No geometry column found.\n");
fprintf(stderr, "The DBF file will be created "
printf( "No geometry column found.\n");
printf( "The DBF file will be created "
"but not the shx or shp files.\n");
}
@ -2428,34 +2528,34 @@ initialize()
{
case MULTILINETYPE:
case LINETYPE:
if (outdims == 'z') outshptype=SHPT_ARCZ;
else if (outdims == 'm') outshptype=SHPT_ARCM;
if (outtype == 'z') outshptype=SHPT_ARCZ;
else if (outtype == 'm') outshptype=SHPT_ARCM;
else outshptype=SHPT_ARC;
break;
case POLYGONTYPE:
case MULTIPOLYGONTYPE:
if (outdims == 'z') outshptype=SHPT_POLYGONZ;
else if (outdims == 'm') outshptype=SHPT_POLYGONM;
if (outtype == 'z') outshptype=SHPT_POLYGONZ;
else if (outtype == 'm') outshptype=SHPT_POLYGONM;
else outshptype=SHPT_POLYGON;
break;
case POINTTYPE:
if (outdims == 'z') outshptype=SHPT_POINTZ;
else if (outdims == 'm') outshptype=SHPT_POINTM;
if (outtype == 'z') outshptype=SHPT_POINTZ;
else if (outtype == 'm') outshptype=SHPT_POINTM;
else outshptype=SHPT_POINT;
break;
case MULTIPOINTTYPE:
if (outdims == 'z') outshptype=SHPT_MULTIPOINTZ;
else if (outdims == 'm') outshptype=SHPT_MULTIPOINTM;
if (outtype == 'z') outshptype=SHPT_MULTIPOINTZ;
else if (outtype == 'm') outshptype=SHPT_MULTIPOINTM;
else outshptype=SHPT_MULTIPOINT;
break;
default:
shp = NULL;
shape_creator = NULL;
fprintf(stderr, "You've found a bug! (%s:%d)\n",
printf( "You've found a bug! (%s:%d)\n",
__FILE__, __LINE__);
return 0;
@ -2604,10 +2704,14 @@ getMaxFieldSize(PGconn *conn, char *schema, char *table, char *fname)
"select max(octet_length(\"%s\")) from \"%s\"",
fname, table);
}
#if VERBOSE > 2
printf( "maxFieldLenQuery: %s\n", query);
#endif
res = PQexec(conn, query);
free(query);
if ( ! res || PQresultStatus(res) != PGRES_TUPLES_OK ) {
fprintf(stderr, "%s", PQerrorMessage(conn));
printf( "Querying for maximum field length: %s",
PQerrorMessage(conn));
return -1;
}
@ -2635,7 +2739,7 @@ HexDecode(byte *hex)
len = strlen(hex)/2;
ret = (byte *)malloc(len);
if ( ! ret ) {
fprintf(stderr, "Out of virtual memory\n");
printf( "Out of virtual memory\n");
exit(1);
}
@ -2667,7 +2771,7 @@ HexDecode(byte *hex)
else if ( *hexptr > 64 && *hexptr < 71 )
byt = (((*hexptr)-55)<<4);
else {
fprintf(stderr, "Malformed WKB\n");
printf( "Malformed WKB\n");
exit(1);
}
hexptr++;
@ -2678,7 +2782,7 @@ HexDecode(byte *hex)
else if ( *hexptr > 64 && *hexptr < 71 )
byt |= ((*hexptr)-55);
else {
fprintf(stderr, "Malformed WKB\n");
printf("Malformed WKB\n");
exit(1);
}
hexptr++;
@ -2817,6 +2921,9 @@ shapetypename(int num)
}
/**********************************************************************
* $Log$
* Revision 1.59 2004/10/06 17:04:38 strk
* ZM handling. Log trimmed.
*
* Revision 1.58 2004/09/23 16:14:19 strk
* Added -m / -z switches to control output type: XYM,XYMZ.
*
@ -2836,123 +2943,4 @@ shapetypename(int num)
* postgis version detected at runtime.
* Endiannes unchecked ... TODO.
*
* Revision 1.53 2004/08/05 16:53:29 strk
* schema support patches sent by Mark
*
* Revision 1.52 2004/06/16 13:42:05 strk
* Added schema support in getMaxFieldSize.
* Added direct support for TIMESTAMP field types (thanks to Steffen Macke).
*
* Revision 1.51 2004/05/13 12:24:15 strk
* Transformed NULL numeric values to 0 as it was before the introduction
* of bigint bug workaround.
*
* Revision 1.50 2004/05/13 12:13:01 strk
* Used DBFWriteAttributeDirectly interface for writing attributes.
* This way we are not affected by shapelib long-integer bug.
*
* Revision 1.49 2004/05/13 12:07:13 strk
* Other fix in 3d handling - you should now be able to dump as 2d or 3d any 2d or 3d object
*
* Revision 1.48 2004/05/13 11:59:08 strk
* Fixed bug in 3d features handling.
*
* Revision 1.47 2004/04/21 09:13:15 strk
* Attribute names escaping mechanism added. You should now
* be able to dump a shapefile equal to the one loaded.
*
* Revision 1.46 2004/04/21 07:38:34 strk
* Memory allocated for main_scan_query was not enough when using binary cursor. Fixed
*
* Revision 1.45 2004/03/29 10:20:48 strk
* Fixed a bug in WKB parsing for Multipoints.
* Fixed a bug in -d handling for WKB.
* Added point->multipoint fluffing capabilities.
*
* Revision 1.44 2004/03/10 18:46:07 strk
* Fixed a bug reducing the output shapes from Multipolygon tables.
*
* Revision 1.43 2004/03/06 17:43:06 strk
* Added RCSID string in usage output
*
* Revision 1.42 2004/02/09 18:49:23 strk
* byte endiannes detected empirically
*
* Revision 1.41 2004/02/06 08:26:02 strk
* updated wkb reading funx to reflect changes made by pramsey in postgis_inout.c to be nicer with solaris
*
* Revision 1.40 2003/12/27 13:30:23 strk
* Added schema specification support
*
* Revision 1.39 2003/12/19 18:55:46 strk
* substituted setenv() calls with putenv() for Solaris support
*
* Revision 1.38 2003/12/04 19:11:56 strk
* code cleanup (removed useless and leaking malloc calls)
*
* Revision 1.37 2003/11/26 18:54:22 strk
* fixed bug in HexDecoder, made WKB parsing the default
*
* Revision 1.36 2003/11/26 18:14:11 strk
* binary cursor implemented
*
* Revision 1.35 2003/11/26 17:21:00 strk
* Made HEXWKB parsing settable at compile time
*
* Revision 1.34 2003/11/26 16:40:41 strk
* Handled NULLS in wkb parsing, reduced functions args
*
* Revision 1.33 2003/11/26 15:45:53 strk
* wkb support for all geom types
*
* Revision 1.32 2003/11/26 14:31:20 strk
* WKB start to work
*
* Revision 1.31 2003/11/25 17:28:03 strk
* hardly trying to get WKB parsing work
*
* Revision 1.30 2003/11/24 17:36:28 strk
* Removed useless BYTE_ORDER checks
*
* Revision 1.29 2003/11/21 23:51:14 pramsey
* Added Cygwin endian definition include to fix windows compile.
*
* Revision 1.28 2003/11/20 18:01:26 strk
* patch from m.spring@gmx.de
*
* Revision 1.27 2003/11/20 15:27:20 strk
* Removed some useless strdups.
* Removed pgtype 22 (int2vector) from the list of integer DBF field types.
* Added pgtype 1700 (numeric) in DBF doubles list.
*
* Revision 1.26 2003/11/18 14:58:47 strk
* default row buffer lenght set to 100
*
* Revision 1.25 2003/11/18 14:39:26 strk
* Some more structuring. Initialization routine moved out of main loop.
* Preparing dumper for WKB parsing.
*
* Revision 1.24 2003/11/16 00:27:46 strk
* Huge code re-organization. More structured code, more errors handled,
* cursor based iteration, less code lines.
*
* Revision 1.23 2003/11/14 22:04:51 strk
* Used environment vars to pass libpq connection options (less error prone,
* easier to read). Printed clearer error message on query error.
*
* Revision 1.22 2003/09/10 22:44:56 jeffloun
* got rid of warning...
*
* Revision 1.21 2003/09/10 22:40:11 jeffloun
* changed it to make the field names in the dbf file capital letters
*
* Revision 1.20 2003/09/10 21:36:04 jeffloun
* fixed a bug in is_clockwise...
*
* Revision 1.19 2003/07/01 18:30:55 pramsey
* Added CVS revision headers.
*
* Revision 1.18 2003/02/04 21:39:20 pramsey
* Added CVS substitution strings for logging.
*
**********************************************************************/