From 1afeceac458d3e544e88bd187cab34c5d74d140a Mon Sep 17 00:00:00 2001
From: Sandro Santilli <strk@keybit.net>
Date: Mon, 24 Oct 2005 16:12:41 +0000
Subject: [PATCH] Reverted backport of stricter INTEGER and STRING attributes
 handling. The change is too big to appear in the 1.0 branch.

git-svn-id: http://svn.osgeo.org/postgis/branches/pgis_1_0@1994 b70326c6-7e19-0410-871a-916f4a2858ee
---
 loader/pgsql2shp.c | 100 ++++++++-------------------------------------
 loader/shp2pgsql.c |  27 +++++-------
 2 files changed, 27 insertions(+), 100 deletions(-)

diff --git a/loader/pgsql2shp.c b/loader/pgsql2shp.c
index 2bfe256e5..5dd322105 100644
--- a/loader/pgsql2shp.c
+++ b/loader/pgsql2shp.c
@@ -2414,8 +2414,7 @@ initialize(void)
 
 	if ( schema )
 	{
-		sprintf(query, "SELECT a.attname, a.atttypid, a.attlen, "
-			"a.atttypmod FROM "
+		sprintf(query, "SELECT a.attname, a.atttypid, a.attlen FROM "
 			"pg_attribute a, pg_class c, pg_namespace n WHERE "
 			"n.nspname = '%s' AND a.attrelid = c.oid AND "
 			"n.oid = c.relnamespace AND "
@@ -2424,8 +2423,7 @@ initialize(void)
 	}
 	else
 	{
-		sprintf(query, "SELECT a.attname, a.atttypid, a.attlen, "
-			"a.atttypmod FROM "
+		sprintf(query, "SELECT a.attname, a.atttypid, a.attlen FROM "
 			"pg_attribute a, pg_class c WHERE "
 			"a.attrelid = c.oid and a.attnum > 0 AND "
 			"a.atttypid != 0 AND "
@@ -2473,7 +2471,7 @@ initialize(void)
 	for (i=0; i<PQntuples(res); i++)
 	{
 		int j;
-		int type, size, mod;
+		int type, size;
 		char *fname; // pgsql attribute name
 		char *ptr;
 		char field_name[32]; // dbf version of field name
@@ -2481,7 +2479,6 @@ initialize(void)
 		fname = PQgetvalue(res, i, 0);
 		type = atoi(PQgetvalue(res, i, 1));
 		size = atoi(PQgetvalue(res, i, 2));
-		mod = atoi(PQgetvalue(res, i, 3));
 
 //printf( "A: %s, T: %d, S: %d\n", fname, type, size);
 		/*
@@ -2578,56 +2575,10 @@ initialize(void)
 		 * Find appropriate type of dbf attributes
 		 */
 
-		/* int2 type */
-		if ( type == 21 )
+		/* integer type */
+		if(type == 20 || type == 21 || type == 23)
 		{
-			/* 
-			 * Longest text representation for
-			 * an int2 type (16bit) is 6 bytes
-			 * (-32768)
-			 */
-			if ( DBFAddField(dbf, field_name, FTInteger,
-				6, 0) == -1 )
-			{
-				printf( "error - Field could not "
-					"be created.\n");
-				return 0;
-			}
-			type_ary[mainscan_nflds]=1;
-			mainscan_flds[mainscan_nflds++] = fname;
-			continue;
-		}
-
-		/* int4 type */
-		if ( type == 23 )
-		{
-			/* 
-			 * Longest text representation for
-			 * an int4 type (32bit) is 11 bytes
-			 * (-2147483648)
-			 */
-			if ( DBFAddField(dbf, field_name, FTInteger,
-				11, 0) == -1 )
-			{
-				printf( "error - Field could not "
-					"be created.\n");
-				return 0;
-			}
-			type_ary[mainscan_nflds]=1;
-			mainscan_flds[mainscan_nflds++] = fname;
-			continue;
-		}
-
-		/* int8 type */
-		if ( type == 20 )
-		{
-			/* 
-			 * Longest text representation for
-			 * an int8 type (64bit) is 20 bytes
-			 * (-9223372036854775808)
-			 */
-			if ( DBFAddField(dbf, field_name, FTInteger,
-				20, 0) == -1 )
+			if(DBFAddField(dbf, field_name, FTInteger,16,0) == -1)
 			{
 				printf( "error - Field could not "
 					"be created.\n");
@@ -2638,15 +2589,7 @@ initialize(void)
 			continue;
 		}
 		
-		/*
-		 * double or numeric types:
-  		 *    700: float4
-		 *    701: float8
-		 *   1700: numeric
-		 *
-		 *
-		 * TODO: stricter handling of sizes
-		 */
+		/* double type */
 		if(type == 700 || type == 701 || type == 1700 )
 		{
 			if(DBFAddField(dbf, field_name,FTDouble,32,10) == -1)
@@ -2679,29 +2622,14 @@ initialize(void)
 		}
 
 		/*
-		 * For variable-sized fields we'll use either 
-		 * maximum allowed size (atttypmod) or max actual
-		 * attribute value in table.
+		 * For variable-sized fields we'll use max size in table
+		 * as dbf field size
 		 */
 		else if(size == -1)
 		{
-			/*
-			 * 1042 is bpchar,  1043 is varchar
-			 * mod is maximum allowed size, including
-			 * header which contains *real* size.
-			 */
-			if ( (type == 1042 || type == 1043) && mod != -1 )
-			{
-				size = mod-4; // 4 is header size
-			}
-			else
-			{
-				size = getMaxFieldSize(conn, schema,
-					table, fname);
-				if ( size == -1 ) return 0;
-				if ( ! size ) size = 32;
-				// might 0 be a good size ?
-			}
+			size = getMaxFieldSize(conn, schema, table, fname);
+			if ( size == -1 ) return 0;
+			if ( ! size ) size = 32; // might 0 be a good size ?
 		}
 //printf( "FIELD_NAME: %s, SIZE: %d\n", field_name, size);
 		
@@ -3194,6 +3122,10 @@ create_usrquerytable(void)
 
 /**********************************************************************
  * $Log$
+ * Revision 1.74.2.6  2005/10/24 16:12:41  strk
+ * Reverted backport of stricter INTEGER and STRING attributes handling.
+ * The change is too big to appear in the 1.0 branch.
+ *
  * Revision 1.74.2.5  2005/10/24 11:31:27  strk
  * Backported stricter STRING and INTEGER attributes handling.
  *
diff --git a/loader/shp2pgsql.c b/loader/shp2pgsql.c
index 664a9daff..2900ee819 100644
--- a/loader/shp2pgsql.c
+++ b/loader/shp2pgsql.c
@@ -515,7 +515,7 @@ CreateTable(void)
 		field_width = widths[j];
 		field_precision = precisions[j];
 
-		printf(",\n\"%s\" ", field_names[j]);
+		printf(", \"%s\" ", field_names[j]);
 
 		if(hDBFHandle->pachFieldType[j] == 'D' ) /* Date field */
 		{
@@ -527,31 +527,22 @@ CreateTable(void)
 
 			if(type == FTString)
 			{
-				// use DBF attribute size as maximum width
-				printf ("varchar(%d)", field_width);
+				printf ("varchar");
 			}
 			else if(type == FTInteger)
 			{
-				if ( forceint4 )
+				if ( forceint4 || field_width <= 9 )
 				{
 					printf ("int4");
 				}
-				else if  ( field_width <= 5 )
+				else if( field_width > 18 )
 				{
-					printf ("int2");
-				}
-				else if  ( field_width <= 10 )
-				{
-					printf ("int4");
-				}
-				else if  ( field_width <= 19 )
-				{
-					printf ("int8");
+					printf("numeric(%d,0)",
+						field_width);
 				}
 				else 
 				{
-					printf("numeric(%d,0)",
-						field_width);
+					printf ("int8");
 				}
 			}
 			else if(type == FTDouble)
@@ -1670,6 +1661,10 @@ utf8 (const char *fromcode, char *inputbuf)
 
 /**********************************************************************
  * $Log$
+ * Revision 1.88.2.13  2005/10/24 16:12:41  strk
+ * Reverted backport of stricter INTEGER and STRING attributes handling.
+ * The change is too big to appear in the 1.0 branch.
+ *
  * Revision 1.88.2.12  2005/10/24 15:54:16  strk
  * fixed wrong assumption about maximum size of integer attributes (width is maximum size of text representation)
  *
-- 
2.40.0