[postgis-devel] loader incompatibility
strk at refractions.net
strk at refractions.net
Tue Apr 5 11:04:29 PDT 2005
On Tue, Apr 05, 2005 at 06:18:24PM +0200, Markus Schaber wrote:
> Hi, Strk,
>
> strk at refractions.net schrieb:
>
> > I need to look closer at them, as I told you I see too many arguments
> > to the load_data function. I guess it could take NO args.
>
> Yes, if we use global variables instead of local ones for trans,
> num_entities and j, we can make it taking no arguments.
That's not what I had in mind.
Are num_entitities, j and trans needed by outside code ?
--strk;
>
> The attached patch changes this.
>
> BTW, my personal preference are local variables and function arguments,
> because global variables tend to lead to maintainance nightmares.
>
> Markus
> Index: doc/postgis.xml
> ===================================================================
> RCS file: /home/cvs/postgis/postgis/doc/postgis.xml,v
> retrieving revision 1.135
> diff -u -r1.135 postgis.xml
> --- doc/postgis.xml 5 Apr 2005 08:00:07 -0000 1.135
> +++ doc/postgis.xml 5 Apr 2005 16:17:50 -0000
> @@ -1283,13 +1283,23 @@
> </varlistentry>
>
> <varlistentry>
> + <term>-p</term>
> +
> + <listitem>
> + <para>Only produces the table creation SQL code, without adding
> + any actual data. This can be used if you need to completely
> + separate the table creation and data loading steps.</para>
> + </listitem>
> + </varlistentry>
> +
> + <varlistentry>
> <term>-D</term>
>
> <listitem>
> - <para>Creates a new table and populates it from the Shape file.
> - This uses the PostgreSQL "dump" format for the output data and
> - is much faster to load than the default "insert" SQL format. Use
> - this for very large data sets.</para>
> + <para>Use the PostgreSQL "dump" format for the output data. This
> + can be combined with -a, -c and -d. It is much faster to load
> + than the default "insert" SQL format. Use this for very large data
> + sets.</para>
> </listitem>
> </varlistentry>
>
> @@ -1334,6 +1344,8 @@
>
> </variablelist>
>
> + <para>Note that -a, -c, -d and -p are mutually exclusive.</para>
> +
> <para>An example session using the loader to create an input file and
> uploading it might look like this:</para>
>
> Index: doc/man/shp2pgsql.1
> ===================================================================
> RCS file: /home/cvs/postgis/postgis/doc/man/shp2pgsql.1,v
> retrieving revision 1.3
> diff -u -r1.3 shp2pgsql.1
> --- doc/man/shp2pgsql.1 5 Apr 2005 13:43:50 -0000 1.3
> +++ doc/man/shp2pgsql.1 5 Apr 2005 16:17:50 -0000
> @@ -26,8 +26,14 @@
> Creates a new table and populates it from the Shape file. This is the default mode.
>
> .TP
> +\fB\-p\fR
> +Only produces the table creation SQL code, without adding any actual data. This can
> +be used if you need to completely separate the table creation and data loading steps.
> +
> +.TP
> \fB\-D\fR
> -Use the PostgreSQL "dump" format for the output data. This can be combined with -d, -a and -c and is much faster to load than the default "insert" SQL format. Use this for very large data sets.
> +Use the PostgreSQL "dump" format for the output data. This can be combined with -a, -c and -d.
> +It is much faster to load than the default "insert" SQL format. Use this for very large data sets.
>
> .TP
> \fB\-s\fR <\fISRID\fR>
> @@ -47,6 +53,9 @@
> Note that this will introduce coordinate drifts and will drop
> M values from shapefiles.
>
> +.LP
> +Note that -a, -c, -d and -p are mutually exclusive.
> +
> .SH "EXAMPLES"
> .LP
> An example session using the loader to create an input file and uploading it might look like this:
> Index: loader/README.shp2pgsql
> ===================================================================
> RCS file: /home/cvs/postgis/postgis/loader/README.shp2pgsql,v
> retrieving revision 1.3
> diff -u -r1.3 README.shp2pgsql
> --- loader/README.shp2pgsql 4 May 2002 22:44:04 -0000 1.3
> +++ loader/README.shp2pgsql 5 Apr 2005 16:17:50 -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: loader/shp2pgsql.c
> ===================================================================
> RCS file: /home/cvs/postgis/postgis/loader/shp2pgsql.c,v
> retrieving revision 1.84
> diff -u -r1.84 shp2pgsql.c
> --- loader/shp2pgsql.c 4 Apr 2005 20:51:26 -0000 1.84
> +++ loader/shp2pgsql.c 5 Apr 2005 16:17:51 -0000
> @@ -69,6 +69,10 @@
> unsigned int wkbtype;
> char *shp_file;
> int hwgeom = 0; // old (hwgeom) mode
> +int trans;
> +int num_entities;
> +int j;
> +
> #ifdef USE_ICONV
> char *encoding=NULL;
> #endif
> @@ -92,6 +96,7 @@
> int PIP( Point P, Point* V, int n );
> void *safe_malloc(size_t size);
> void create_table(void);
> +void load_data(void);
> void usage(char *me, int exitcode);
> void InsertPoint(void);
> void InsertPointWKT(void);
> @@ -342,10 +347,10 @@
> int
> main (int ARGC, char **ARGV)
> {
> - int trans,field_precision, field_width;
> - int num_entities, phnshapetype;
> + int field_precision, field_width;
> + int phnshapetype;
> double padminbound[8], padmaxbound[8];
> - int j,z;
> + int z;
> char name[64];
> char name2[64];
> DBFFieldType type = -1;
> @@ -532,9 +537,9 @@
> 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",
> @@ -547,10 +552,39 @@
> }
> }
>
> - obj = SHPReadObject(hSHPHandle,0);
> -
> + if (opt != 'p') { /*only if we do not have prepare mode*/
> + load_data();
> + }
> +
> + 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()
> +
> +
> +void
> +load_data(void) {
> + /**************************************************************
> *
> * MAIN SHAPE OBJECTS SCAN
> *
> @@ -643,41 +677,15 @@
> 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()
> +}
>
> void
> create_table(void)
> @@ -783,19 +791,19 @@
> 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");
> fprintf(stderr, "\n");
> - fprintf(stderr, " -D Use postgresql dump format (defaults to sql insert\n");
> - fprintf(stderr, " statments.\n");
> + fprintf(stderr, " -D Use postgresql dump format (defaults to sql insert statments.)\n");
> fprintf(stderr, "\n");
> fprintf(stderr, " -k Keep postgresql identifiers case.\n");
> fprintf(stderr, "\n");
> @@ -1372,7 +1380,7 @@
> int curindex=0;
> char *ptr;
>
> - while ((c = getopt(ARGC, ARGV, "kcdaDs:g:iW:w")) != EOF){
> + while ((c = getopt(ARGC, ARGV, "kcdapDs:g:iW:w")) != EOF){
> switch (c) {
> case 'c':
> if (opt == ' ')
> @@ -1392,6 +1400,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