[postgis-devel] shp2pgsql patch
strk at refractions.net
strk at refractions.net
Mon Apr 4 03:01:06 PDT 2005
On Fri, Apr 01, 2005 at 06:34:37PM +0200, Markus Schaber wrote:
> Hi, Strk,
>
> Refactoring the main loop into its own function makes the patch
> noticeably smaller.
>
> I now also moved the deletion of old tables (-d mode) into the
> BEGIN;END; block. This protects the user from losing his old table when
> the insertion of new data fails.
>
> Or are there any good reasons to exclude this from transaction?
It was intended as a "make sure I'm building a new table" option.
So that a failure in DROP would not fail the operation.
But it is probably better to just wrap the whole file in a transaction
and let the user try -c first and -d if it fails due to presence
of another table...
I'd include your patch as it is, w/out requiring RC7.
Does it sound azardous ?
--strk;
>
> Markus
> 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;
> _______________________________________________
> postgis-devel mailing list
> postgis-devel at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-devel
More information about the postgis-devel
mailing list