Index: README.shp2pgsql
===================================================================
RCS file: /home/cvs/postgis/postgis/loader/README.shp2pgsql,v
retrieving revision 1.3
diff -u -r1.3 README.shp2pgsql
--- README.shp2pgsql	4 May 2002 22:44:04 -0000	1.3
+++ README.shp2pgsql	1 Apr 2005 16:30:44 -0000
@@ -38,19 +38,23 @@
 
 The options are as follows:
 
-(-a || -c || -d) these options are mutually exclusive.
+(-a || -c || -d || -p) these options are mutually exclusive.
 
   -a    Append mode. Do not delete the target table or try to create
         a new table, simple insert the data into the existing table.
         A table will have to exist for this to work, it is usually
-        used after a create mode as been run once.(mutually exclusive
-	with -c and -d)
+        used after a create mode as been run once or after -p. (mutually
+        exclusive with -c, -d and -p)
   -c    Create mode. This is the default mode is no other is specified.
 	Create a new table and upload the data into that table.
-	(mutually exclusive with -a and -d)
+	(mutually exclusive with -a, -d and -p)
   -d    Delete mode. Delete the database table named <tablename>, then
 	create a new one with that name before uploading the data into
-	the new empty database table.(mutually exclusive with -a and -c)
+	the new empty database table. (mutually exclusive with -a, -c 
+        and -p)
+  -p    Prepare mode. Read the table schema from the shape file and 
+        create the new table, but do not insert any data. (mutually
+        exclusive with -a, -c and -d)
 
   -D Dump. When inserting the data into the table use 'dump' format.
 	Dump format is used by PostgreSQL for large data dumps and 
Index: shp2pgsql.c
===================================================================
RCS file: /home/cvs/postgis/postgis/loader/shp2pgsql.c,v
retrieving revision 1.83
diff -u -r1.83 shp2pgsql.c
--- shp2pgsql.c	15 Mar 2005 12:24:40 -0000	1.83
+++ shp2pgsql.c	1 Apr 2005 16:30:45 -0000
@@ -91,6 +91,7 @@
 int PIP( Point P, Point* V, int n );
 void *safe_malloc(size_t size);
 void create_table(void);
+int load_data(int num_entities, int trans);
 void usage(char *me, int exitcode);
 void InsertPoint(void);
 void InsertMultiPoint(void);
@@ -398,6 +399,8 @@
 	}
 #endif // defined USE_ICONV
 
+	printf("BEGIN;\n");
+
 	if(opt == 'd')
 	{
 		//---------------Drop the table--------------------------
@@ -525,12 +528,10 @@
 
 	trans=0;
 
-	printf("BEGIN;\n");
-
 	//if opt is 'a' do nothing, go straight to making inserts
-	if(opt == 'c' || opt == 'd') create_table();
+	if(opt == 'c' || opt == 'd' || opt == 'p') create_table();
 
-	if (dump_format){
+	if (dump_format && opt != 'p'){
 		if ( schema )
 		{
 			printf("COPY \"%s\".\"%s\" %s FROM stdin;\n",
@@ -543,10 +544,40 @@
 		}
 	}
 
-	obj = SHPReadObject(hSHPHandle,0);
-	
+        if (opt != 'p') { /*only if we do not have prepare mode*/
+                j = load_data(num_entities, trans);
+        }
+        
+        free(col_names);
+	if(opt != 'a')
+	{
+		if ( schema )
+		{
+			printf("\nALTER TABLE ONLY \"%s\".\"%s\" ADD CONSTRAINT \"%s_pkey\" PRIMARY KEY (gid);\n",schema,table,table);
+			if(j > 1 && opt != 'p')
+			{
+				printf("SELECT setval ('\"%s\".\"%s_gid_seq\"', %i, true);\n", schema, table, j-1);
+			}
+		}
+		else
+		{
+			printf("\nALTER TABLE ONLY \"%s\" ADD CONSTRAINT \"%s_pkey\" PRIMARY KEY (gid);\n",table,table);
+			if(j > 1 && opt != 'p'){
+				printf("SELECT setval ('\"%s_gid_seq\"', %i, true);\n", table, j-1);
+			}
+		}
+	}
 
-/**************************************************************
+	printf("END;\n"); //End the last transaction
+
+	return(1);
+}//end main()
+
+
+int
+load_data(int num_entities, int trans) {
+        int j;
+ /**************************************************************
  * 
  *   MAIN SHAPE OBJECTS SCAN
  * 
@@ -635,41 +666,16 @@
 				break;
 
 		}
-		
+
 		SHPDestroyObject(obj);	
 
 	} // END of MAIN SHAPE OBJECT LOOP
 
-
 	if ((dump_format) ) {
 		printf("\\.\n");
-
-	} 
-
-	free(col_names);
-	if(opt != 'a')
-	{
-		if ( schema )
-		{
-			printf("\nALTER TABLE ONLY \"%s\".\"%s\" ADD CONSTRAINT \"%s_pkey\" PRIMARY KEY (gid);\n",schema,table,table);
-			if(j > 1)
-			{
-				printf("SELECT setval ('\"%s\".\"%s_gid_seq\"', %i, true);\n", schema, table, j-1);
-			}
-		}
-		else
-		{
-			printf("\nALTER TABLE ONLY \"%s\" ADD CONSTRAINT \"%s_pkey\" PRIMARY KEY (gid);\n",table,table);
-			if(j > 1){
-				printf("SELECT setval ('\"%s_gid_seq\"', %i, true);\n", table, j-1);
-			}
-		}
 	}
-
-	printf("END;\n"); //End the last transaction
-
-	return(1);
-}//end main()
+        return j;
+}
 
 void
 create_table(void)
@@ -775,13 +781,14 @@
 	fprintf(stderr, "OPTIONS:\n");
 	fprintf(stderr, "  -s <srid>  Set the SRID field. If not specified it defaults to -1.\n");
 	fprintf(stderr, "\n");
-	fprintf(stderr, "  (-d|a|c) These are mutually exclusive options:\n");
-	fprintf(stderr, "      -d  Drops the table , then recreates it and populates\n");
+	fprintf(stderr, "  (-d|a|c|p) These are mutually exclusive options:\n");
+	fprintf(stderr, "      -d  Drops the table, then recreates it and populates\n");
 	fprintf(stderr, "          it with current shape file data.\n");
 	fprintf(stderr, "      -a  Appends shape file into current table, must be\n");
 	fprintf(stderr, "          exactly the same table schema.\n");
 	fprintf(stderr, "      -c  Creates a new table and populates it, this is the\n");
 	fprintf(stderr, "          default if you do not specify any options.\n");
+	fprintf(stderr, "      -p  Only creates the table.");
 	fprintf(stderr, "\n");
 	fprintf(stderr, "  -g <geometry_column> Specify the name of the geometry column\n");
 	fprintf(stderr, "     (mostly useful in append mode).\n");
@@ -1104,7 +1111,7 @@
 	int curindex=0;
 	char  *ptr;
 
-	while ((c = getopt(ARGC, ARGV, "kcdaDs:g:iW:")) != EOF){
+	while ((c = getopt(ARGC, ARGV, "kcdapDs:g:iW:")) != EOF){
                switch (c) {
                case 'c':
                     if (opt == ' ')
@@ -1124,6 +1131,12 @@
                     else
                          return 0;
                     break;
+	       case 'p':
+                    if (opt == ' ')
+                         opt ='p';
+                    else
+                         return 0;
+                    break;
 	       case 'D':
 		    dump_format =1;
                     break;
