Alright, here is the patches vor v.in.ascii.

Cheers,

Benjamin

Benjamin Ducke wrote:
> Unfortunately, it returns DB_OK.
> There seems to be some caching going on which I don't quite
> understand at the moment.
> Starting and stopping the db driver in the right sequence seems
> to be important.
> Anyway, I solved the problem by doing the deletion at an earlier
> point in the program.
> 
> Everything seems to work OK now. I'll do some tests with more
> complex tables, then post a patch.
> 
> Benjamin
> 
> Moritz Lennert wrote:
>> On 10/01/08 13:52, Benjamin Ducke wrote:
>>> OK, I have it almost working except for one annoyance:
>>>
>>> If the table already exists, then --o should allow the user to
>>> overwrite it. Thus, I check for that flag and delete the old
>>> table, if it exists, using:
>>>
>>>   db_delete_table ( connection.driverName, connection.databaseName,
>>>                     new->answer );
>>>
>>> But even so, the next call to
>>>
>>>   db_execute_immediate()
>>>
>>> complains about the table still being there and creation of the
>>> new table fails.
>>> I suppose that db_delete_table() does not delete the table immediately?
>> db_delete_table() sends a "drop table XYZ" sql query to the database
>> backend, so it should delete the table.
>>
>> Launching
>>
>> echo "drop table ggg" | db.execute
>> followed by
>> echo "create table ggg (cat int, value double)" | db.execute
>>
>> works without a problem.
>>
>> What does db_delete_table return ?
>>
>> Moritz
>>
>> _______________________________________________
>> grass-dev mailing list
>> [email protected]
>> http://lists.osgeo.org/mailman/listinfo/grass-dev
>>
>>
> 

-- 
Benjamin Ducke, M.A.
Archäoinformatik
(Archaeoinformation Science)
Institut für Ur- und Frühgeschichte
(Inst. of Prehistoric and Historic Archaeology)
Christian-Albrechts-Universität zu Kiel
Johanna-Mestorf-Straße 2-6
D 24098 Kiel
Germany

Tel.: ++49 (0)431 880-3378 / -3379
Fax : ++49 (0)431 880-7300
www.uni-kiel.de/ufg

--- ../v.in.ascii/description.html	2008-01-09 10:52:33.000000000 +0100
+++ ./description.html	2008-01-10 15:46:27.000000000 +0100
@@ -187,6 +187,13 @@
 cut -d<the_field_separator_character> -f<comma-separated_list_of_columns> input_file | v.in.ascii <your_options>
 </pre></div>
 
+<h3>Importing only a database table</h3>
+The <b>-g</b> flag may be used to skip creation of vector objects (geometries) entirely and create only
+an attribute data table. The table name will be as specified by the <b>output=</b> parameter.<br>
+In the case of DBase format tables, a new DBF file will be created in the mapset's <b>dbf</b> directory.<br>
+All parameters relating to x, y or z coordinate fields will be ignored, but category field handling remains
+the same as in the case of importing a full vector map.
+
 
 <h2>EXAMPLES</h2>
 
--- ../v.in.ascii/in.c	2008-01-09 15:16:49.000000000 +0100
+++ ./in.c	2008-01-10 15:38:37.000000000 +0100
@@ -27,6 +27,19 @@
 
 #define	A_DIR	"dig_ascii"
 
+
+/* this will attempt to delete a table only if it exists */
+void remove_table ( char* driver, char *db, char *table ) {
+
+	if ( db_table_exists ( driver , db , table ) ) {
+		if ( db_delete_table ( driver, db, table ) != DB_OK ) {
+		  	G_warning(_("Table <%s> exists and could not be deleted"), table );		  		    	
+		}
+	}
+	
+}
+
+
 int main(int argc, char *argv[])
 {
     FILE *ascii;
@@ -34,11 +47,11 @@
     struct Option *old, *new, *delim_opt, *columns_opt, *xcol_opt,
 	*ycol_opt, *zcol_opt, *catcol_opt, *format_opt, *skip_opt;
     int xcol, ycol, zcol, catcol, format, skip_lines;
-    struct Flag *zcoorf, *t_flag, *e_flag, *noheader_flag, *notopol_flag,
+    struct Flag *zcoorf, *t_flag, *g_flag, *e_flag, *noheader_flag, *notopol_flag,
 	*region_flag;
     char *table;
     char *fs;
-    int zcoor = WITHOUT_Z, make_table;
+    int zcoor = WITHOUT_Z, make_table, table_only;
 
     struct Map_info Map;
 
@@ -151,6 +164,10 @@
     t_flag->key = 't';
     t_flag->description = _("Do not create table in points mode");
     
+    g_flag = G_define_flag();
+    g_flag->key = 'g';
+    g_flag->description = _("Create only table, no vector objects/geometries");    
+
     notopol_flag = G_define_flag();
     notopol_flag->key = 'b';
     notopol_flag->description = _("Do not build topology in points mode");
@@ -169,23 +186,63 @@
     else
 	format = FORMAT_ALL;
 
+
+    /* check if flags and options make sense for the case where
+    	the user choose to create _only_ a table (-g).
+    */
+    
+    table_only = 0;
+    
+    if ( g_flag->answer )  {    
+    
+    	make_table = 1;
+	table_only = 1;
+    
+    	if  ( ( notopol_flag->answer ) ||
+	      ( e_flag->answer ) ||
+	      ( region_flag->answer ) ||
+	      ( t_flag->answer ) ||
+	      ( zcoorf->answer ) )
+	{
+		G_fatal_error (_("Cannot combine -g flag with -b, -e, -r, -t, or -z flag(s)"));
+	}
+
+    	if  ( format == FORMAT_ALL ) 
+	{
+		G_fatal_error (_("Flag -t only works for point format input files"));
+	}
+    	
+	if ( ( strcmp ( "1", xcol_opt->answer) ) ||
+	     ( strcmp ( "2", ycol_opt->answer) ) ||
+	     ( strcmp ( "0", zcol_opt->answer) ) )
+	{
+	  	G_warning (_("Table creation only. Any settings for x=, y= or z= will be ignored"));
+	}
+	
+    }
+
+
     skip_lines = atoi(skip_opt->answer);
     if (skip_lines < 0)
 	G_fatal_error(_("Please specify reasonable number of lines to skip"));
 
-    if (zcoorf->answer && format == FORMAT_POINT && !zcol_opt->answer)
+    /* everything related to creating vector objects can be skipped if -g flag was given (create only a table) */
+    if ( !table_only ) {
+      if (zcoorf->answer && format == FORMAT_POINT && !zcol_opt->answer)
 	G_fatal_error(_("Please specify z column"));
 
-    xcol = atoi(xcol_opt->answer) - 1;
-    ycol = atoi(ycol_opt->answer) - 1;
-    zcol = atoi(zcol_opt->answer) - 1;
-
-    /* specifying zcol= implies that a 3D map is needed */
-    if (zcol >= 0 && !zcoorf->answer)
-	zcoorf->answer = 1;
+    
+      xcol = atoi(xcol_opt->answer) - 1;
+      ycol = atoi(ycol_opt->answer) - 1;
+      zcol = atoi(zcol_opt->answer) - 1;
+
+      /* specifying zcol= implies that a 3D map is needed */
+      if (zcol >= 0 && !zcoorf->answer)
+	  zcoorf->answer = 1;
 
-    if (zcoorf->answer && format == FORMAT_POINT && zcol < 0)
-	G_fatal_error(_("Please specify reasonable z column"));
+      if (zcoorf->answer && format == FORMAT_POINT && zcol < 0)
+	  G_fatal_error(_("Please specify reasonable z column"));      
+    }
 
     catcol = atoi(catcol_opt->answer) - 1;
 
@@ -206,20 +263,24 @@
     if (strcmp(fs, "space") == 0)
 	fs = " ";
 
-    /* check dimension */
-    if (zcoorf->answer) {
-	zcoor = 1;
-    }
 
-    Vect_open_new(&Map, new->answer, zcoor);
-    Vect_hist_command(&Map);
+    if ( !table_only ) {
+      /* check dimension */
+      if (zcoorf->answer) {
+	  zcoor = 1;
+      }
 
-    if (e_flag->answer) {
+      Vect_open_new(&Map, new->answer, zcoor);
+      Vect_hist_command(&Map);
+
+      if (e_flag->answer) {
 	Vect_build(&Map, stdout);
 	Vect_close(&Map);
 	exit(EXIT_SUCCESS);
+      }
     }
 
+
     if (format == FORMAT_POINT) {
 	int i, rowlen, ncols, minncols, *coltype, *coltype2, *collen;
 	int n_int = 0, n_double = 0, n_string = 0;
@@ -227,6 +288,7 @@
 	struct field_info *Fi;
 	char *tmp, *key;
 	dbDriver *driver;
+	dbConnection connection;
 	dbString sql;
 	FILE *tmpascii;
 
@@ -239,90 +301,139 @@
 
 	points_analyse(ascii, tmpascii, fs, &rowlen, &ncols, &minncols,
 		       &coltype, &collen, skip_lines, xcol, ycol,
-		       region_flag->answer);
+		       region_flag->answer, table_only );
 
 	G_message(_("Maximum input row length: %d"), rowlen);
 	G_message(_("Maximum number of columns: %d"), ncols);
 	G_message(_("Minimum number of columns: %d"), minncols);
 
 	/* check column numbers */
-	if (xcol >= minncols) {
-	    Vect_delete(new->answer);
-	    G_fatal_error(_
-			  ("x column number > minimum last column number\n(incorrect field separator?)"));
-	}
-	if (ycol >= minncols) {
-	    Vect_delete(new->answer);
-	    G_fatal_error(_
-			  ("y column number > minimum last column number\n(incorrect field separator?)"));
-	}
-	if (zcol >= minncols) {
-	    Vect_delete(new->answer);
-	    G_fatal_error(_("z column number > minimum last column number "
+	if ( !table_only ) {
+	  if (xcol >= minncols) {
+	      Vect_delete(new->answer);
+	      G_fatal_error(_
+			    ("x column number > minimum last column number\n(incorrect field separator?)"));
+	  }
+	  if (ycol >= minncols) {
+	      Vect_delete(new->answer);
+	      G_fatal_error(_
+			    ("y column number > minimum last column number\n(incorrect field separator?)"));
+	  }
+	  if (zcol >= minncols) {
+	      Vect_delete(new->answer);
+	      G_fatal_error(_("z column number > minimum last column number "
+			      "(incorrect field separator?)"));
+	  }	      
+  	  if (catcol >= minncols) {
+	      Vect_delete(new->answer);
+	      G_fatal_error(_("cat column number > minimum last column number "
 			    "(incorrect field separator?)"));
-	}
-	if (catcol >= minncols) {
-	    Vect_delete(new->answer);
-	    G_fatal_error(_("cat column number > minimum last column number "
+	  }
+	  if (coltype[xcol] == DB_C_TYPE_STRING) {
+	      Vect_delete(new->answer);
+	      G_fatal_error(_("x column is not of number type"));
+	  }
+	  if (coltype[ycol] == DB_C_TYPE_STRING) {
+	      Vect_delete(new->answer);
+	      G_fatal_error(_("y column is not of number type"));
+	  }
+	  if (zcol >= 0 && coltype[zcol] == DB_C_TYPE_STRING) {
+	      Vect_delete(new->answer);
+	      G_fatal_error(_("z column is not of number type"));
+	  }
+	  if (catcol >= 0 && coltype[catcol] == DB_C_TYPE_STRING) {
+	      Vect_delete(new->answer);
+	      G_fatal_error(_("cat column is not of number type"));
+	  }
+	} else {
+  	  if (catcol >= minncols) {
+	      G_fatal_error(_("cat column number > minimum last column number "
 			    "(incorrect field separator?)"));
-	}
+	  }
+        }
 
-	if (coltype[xcol] == DB_C_TYPE_STRING) {
-	    Vect_delete(new->answer);
-	    G_fatal_error(_("x column is not of number type"));
-	}
-	if (coltype[ycol] == DB_C_TYPE_STRING) {
-	    Vect_delete(new->answer);
-	    G_fatal_error(_("y column is not of number type"));
-	}
-	if (zcol >= 0 && coltype[zcol] == DB_C_TYPE_STRING) {
-	    Vect_delete(new->answer);
-	    G_fatal_error(_("z column is not of number type"));
-	}
-	if (catcol >= 0 && coltype[catcol] == DB_C_TYPE_STRING) {
-	    Vect_delete(new->answer);
-	    G_fatal_error(_("cat column is not of number type"));
-	}
-
-	/* Create table */
-	make_table = 0;
-	for (i = 0; i < ncols; i++) {
-	    if (xcol != i && ycol != i && zcol != i && catcol != i) {
-		make_table = 1;
-		break;
-	    }
+
+	if ( !table_only ) {
+	
+    	  /* Create table? */
+	  make_table = 0;
+	
+	  for (i = 0; i < ncols; i++) {
+	      if (xcol != i && ycol != i && zcol != i && catcol != i) {
+		  make_table = 1;
+		  break;
+	      }
+	  }	  
 	}
+	
 	if (t_flag->answer) {
 	    make_table = 0;
 	}
 
 	if (make_table) {
-	    Fi = Vect_default_field_info(&Map, 1, NULL, GV_1TABLE);
-	    driver =
-		db_start_driver_open_database(Fi->driver,
-					      Vect_subst_var(Fi->database,
-							     &Map));
-	    if (driver == NULL) {
-		Vect_delete(new->answer);
-		G_fatal_error(_("Unable to open database <%s> by driver <%s>"),
-			      Vect_subst_var(Fi->database, &Map), Fi->driver);
+	
+	    if ( !table_only ) {
+	    	      Fi = Vect_default_field_info(&Map, 1, NULL, GV_1TABLE);
+	      driver =
+		  db_start_driver_open_database(Fi->driver,
+						Vect_subst_var(Fi->database,
+							       &Map));
+	      if (driver == NULL) {	    	
+		  Vect_delete(new->answer);		
+		  G_fatal_error(_("Unable to open database <%s> by driver <%s>"),
+				Vect_subst_var(Fi->database, &Map), Fi->driver);
+	      }
+	    }
+	    
+	    if ( table_only ) {	 
+		db_get_connection ( &connection );
+		    	  
+		if ( db_table_exists ( connection.driverName, connection.databaseName, new->answer ) ) {
+	          if ( module->overwrite ) {
+		    if ( db_delete_table ( connection.driverName, connection.databaseName, new->answer ) != DB_OK ) {
+		  	G_fatal_error(_("Table <%s> exists and could not be deleted"),
+				new->answer );		  		    	
+		    }
+	          } else {
+		  	G_fatal_error(_("Table <%s> exists. Use --o to overwrite"),
+				new->answer );		  
+		  }		
+		}
+	    
+	    	/* start the db driver directly */		
+		driver=db_start_driver_open_database( connection.driverName, 
+				connection.databaseName );
+		if (driver == NULL) {
+		  G_fatal_error(_("Unable to open database <%s> by driver <%s>"),
+				connection.databaseName, connection.driverName );
+	      }
 	    }
+	    
 	    db_begin_transaction(driver);
-
+	    
 	    db_init_string(&sql);
-	    sprintf(buf, "create table %s ( ", Fi->table);
+	    
+	    if (!table_only ) {
+	    	sprintf(buf, "create table %s ( ", Fi->table );
+	    } else {
+	        sprintf(buf, "create table %s ( ", new->answer );
+	    }
 	    db_append_string(&sql, buf);
 
 	    if (catcol < 0) {
-		db_append_string(&sql, "cat integer, ");
+	      db_append_string(&sql, "cat integer, ");
 	    }
 
 	    for (i = 0; i < ncols; i++) {
+	    
 		if (i > 0 && !columns_opt->answer) {
 		    db_append_string(&sql, ", ");
 		}
+		
 		if (catcol == i && coltype[i] != DB_C_TYPE_INT) {
-		    Vect_delete(new->answer);
+		    if ( !table_only ) {    	    	
+		      Vect_delete(new->answer);		    
+		    }
 		    G_fatal_error(_("Category column is not of integer type"));
 		}
 
@@ -332,7 +443,7 @@
 		    if (!columns_opt->answer) {
 			sprintf(buf, "int_%d integer", n_int + 1);
 			db_append_string(&sql, buf);
-			if (catcol == i) {
+			if  ( catcol == i ) {
 			    sprintf(buf, "int_%d", n_int + 1);
 			    key = G_store(buf);
 			}
@@ -359,6 +470,7 @@
 		    break;
 		}
 	    }
+	    
 	    if (columns_opt->answer) {
 		db_append_string(&sql, columns_opt->answer);
 	    }
@@ -366,25 +478,45 @@
 
 	    /* this link is added with default 'cat' key, later deleted and replaced by true key name,
 	     * otherwise if module crashes when the table exists but link is not written it makes troubles */
-	    Vect_map_add_dblink(&Map, 1, NULL, Fi->table, "cat", Fi->database,
+	     
+	    if ( !table_only ) {
+	      Vect_map_add_dblink(&Map, 1, NULL, Fi->table, "cat", Fi->database,
 				Fi->driver);
+	    }
 
 	    /* Create table */
 	    G_debug(3, db_get_string(&sql));
-	    if (db_execute_immediate(driver, &sql) != DB_OK) {
-		Vect_delete(new->answer);
-		G_fatal_error(_("Unable to create table: %s"),
-			      db_get_string(&sql));
+	    	    
+	    if (db_execute_immediate(driver, &sql) != DB_OK) {	    
+	    	if ( !table_only ) {
+		  Vect_delete(new->answer);
+		  G_fatal_error(_("Unable to create table: %s"),
+			      db_get_string(&sql));		  
+		} else {
+		  G_fatal_error(_("Unable to create table: %s"),
+			      db_get_string(&sql));		
+		}
 	    }
 
 	    /* Grant */
-	    if (db_grant_on_table
-		(driver, Fi->table, DB_PRIV_SELECT,
-		 DB_GROUP | DB_PUBLIC) != DB_OK) {
-		Vect_delete(new->answer);
-		G_fatal_error(_("Unable to grant privileges on table <%s>"),
-			      Fi->table);
+	    if ( !table_only ) {
+	      if (db_grant_on_table
+		  (driver, Fi->table, DB_PRIV_SELECT,
+		   DB_GROUP | DB_PUBLIC) != DB_OK) {
+		  Vect_delete(new->answer);
+		  G_fatal_error(_("Unable to grant privileges on table <%s>"),
+				Fi->table);
+	      }
+	    } else {
+	      if (db_grant_on_table
+		  (driver, new->answer, DB_PRIV_SELECT,
+		   DB_GROUP | DB_PUBLIC) != DB_OK) {
+		   remove_table ( connection.driverName, connection.databaseName, new->answer );
+		  G_fatal_error(_("Unable to grant privileges on table <%s>"),
+				new->answer);
+	      }
 	    }
+	    
 
 	    /* Check column types */
 	    if (columns_opt->answer) {
@@ -392,22 +524,36 @@
 		dbTable *table;
 		dbColumn *column;
 
-		db_set_string(&sql, Fi->table);
-		if (db_describe_table(driver, &sql, &table) != DB_OK) {
-		    Vect_delete(new->answer);
-		    G_fatal_error(_("Unable to describe table <%s>"),
-				  Fi->table);
+                if ( !table_only ) {
+		  db_set_string(&sql, Fi->table);
+		  if (db_describe_table(driver, &sql, &table) != DB_OK) {
+			Vect_delete(new->answer);
+			G_fatal_error(_("Unable to describe table <%s>"),
+				      Fi->table);
+		  }
+		} else {
+		  db_set_string(&sql, new->answer);
+		  if (db_describe_table(driver, &sql, &table) != DB_OK) {
+		        remove_table ( connection.driverName, connection.databaseName, new->answer );
+			G_fatal_error(_("Unable to describe table <%s>"),
+				      new->answer);
+		  }		
 		}
 
 		nc = db_get_table_number_of_columns(table);
 
+		
 		if ((catcol >= 0 && nc != ncols) ||
-		    (catcol < 0 && (nc - 1) != ncols)) {
-		    Vect_delete(new->answer);
-		    G_fatal_error(_
-				  ("Number of columns defined (%d) does not match number "
-				   "of columns (%d) in input"),
-				  catcol < 0 ? nc - 1 : nc, ncols);
+		      (catcol < 0 && (nc - 1) != ncols)) {
+		        if ( !table_only ) {
+			  Vect_delete(new->answer);
+			} else {
+			  remove_table ( connection.driverName, connection.databaseName, new->answer );
+			}
+		        G_fatal_error(_
+				    ("Number of columns defined (%d) does not match number "
+				     "of columns (%d) in input"),
+				    catcol < 0 ? nc - 1 : nc, ncols);
 		}
 
 		coltype2 = (int *)G_malloc(ncols * sizeof(int));
@@ -442,7 +588,12 @@
 			break;
 		    case DB_C_TYPE_DOUBLE:
 			if (ctype == DB_C_TYPE_INT) {
-			    Vect_delete(new->answer);
+			
+			    if ( !table_only ) {
+			      Vect_delete(new->answer);
+			    } else {
+			      remove_table ( connection.driverName, connection.databaseName, new->answer );
+			    }
 			    G_fatal_error(_
 					  ("Column number %d defined as integer "
 					   "has double values"), i + 1);
@@ -454,19 +605,34 @@
 			break;
 		    case DB_C_TYPE_STRING:
 			if (ctype == DB_C_TYPE_INT) {
-			    Vect_delete(new->answer);
+			
+			    if ( !table_only ) {
+			      Vect_delete(new->answer);
+			    } else {
+			      remove_table ( connection.driverName, connection.databaseName, new->answer );
+			    }
 			    G_fatal_error(_
 					  ("Column number %d defined as integer "
 					   "has string values"), i + 1);
 			}
 			else if (ctype == DB_C_TYPE_DOUBLE) {
-			    Vect_delete(new->answer);
+			
+			    if ( !table_only ) {
+			      Vect_delete(new->answer);
+			    } else {
+			      remove_table ( connection.driverName, connection.databaseName, new->answer );
+			    }
 			    G_fatal_error(_
 					  ("Column number %d defined as double "
 					   "has string values"), i + 1);
 			}
 			if (length < collen[i]) {
-			    Vect_delete(new->answer);
+			
+			    if ( !table_only ) {
+			      Vect_delete(new->answer);
+			    } else {
+			      remove_table ( connection.driverName, connection.databaseName, new->answer );
+			    }
 			    G_fatal_error(_
 					  ("Length of column %d (%d) is less than "
 					   "maximum value " "length (%d)"),
@@ -488,24 +654,35 @@
 
 	    }
 
-	    if (db_create_index2(driver, Fi->table, key) != DB_OK)
-		G_warning(_("Unable to create index for table <%s>, key <%s>"),
-			  Fi->table, key);
+	    if (!table_only) {
+	      if (db_create_index2(driver, Fi->table, key) != DB_OK)
+		  G_warning(_("Unable to create index for table <%s>, key <%s>"),
+			    Fi->table, key);
+	    } else {
+	      if (db_create_index2(driver, new->answer, key) != DB_OK)
+		  G_warning(_("Unable to create index for table <%s>, key <%s>"),
+			    new->answer, key);	    
+	    }
 
-	    Vect_map_del_dblink(&Map, 1);
-	    Vect_map_add_dblink(&Map, 1, NULL, Fi->table, key, Fi->database,
+	    if ( !table_only ) {
+	      Vect_map_del_dblink(&Map, 1);
+	      Vect_map_add_dblink(&Map, 1, NULL, Fi->table, key, Fi->database,
 				Fi->driver);
-
-	    table = Fi->table;
+              table = Fi->table;
+            } else {
+	      table = new->answer;
+	    }
+	    
+	    
 	}
 	else {
 	    driver = NULL;
 	    table = NULL;
 	}
 
-	points_to_bin(tmpascii, rowlen, &Map, driver, table, fs, ncols,
-		      coltype2, xcol, ycol, zcol, catcol, skip_lines);
-
+	  points_to_bin(tmpascii, rowlen, &Map, driver, table, fs, ncols,
+		      coltype2, xcol, ycol, zcol, catcol, skip_lines, table_only );
+	
 	if (driver) {
 	    G_message(_("Populating table..."));
 	    db_commit_transaction(driver);
@@ -524,12 +701,14 @@
     if (old->answer != NULL)
 	fclose(ascii);
 
-    if (notopol_flag->answer) {
-	Vect_close(&Map);
-    }
-    else {
-	Vect_build(&Map, stdout);
-	Vect_close(&Map);
+    if (!table_only) {
+      if (notopol_flag->answer) {
+	  Vect_close(&Map);
+      }
+      else {
+	  Vect_build(&Map, stdout);
+	  Vect_close(&Map);
+      }
     }
 
     G_done_msg(" ");
--- ../v.in.ascii/local_proto.h	2008-01-09 10:52:33.000000000 +0100
+++ ./local_proto.h	2008-01-10 13:25:48.000000000 +0100
@@ -12,11 +12,11 @@
 
 
 int points_analyse (FILE *, FILE *, char *, int *, int *, int *, int **,
-		     int **, int, int, int, int);
+		     int **, int, int, int, int, int );
 
 int points_to_bin (FILE *, int, struct Map_info *, dbDriver *,
 		   char *, char *, int, int *,
-		   int, int, int, int, int);
+		   int, int, int, int, int, int);
 
 int read_head (FILE *, struct Map_info *);
 
--- ../v.in.ascii/points.c	2008-01-09 10:52:33.000000000 +0100
+++ ./points.c	2008-01-10 13:28:43.000000000 +0100
@@ -50,12 +50,16 @@
  * minncolumns: minimum number of columns
  * column_type: column types
  * column_length: column lengths (string only)
+ *
+ * if table_only == 1, then coordinate fields don't need to be checked for validity
+ *                     (there might not even be any in the input file) 		       
+ *
  */
 
 int points_analyse(FILE * ascii_in, FILE * ascii, char *fs,
 		   int *rowlength, int *ncolumns, int *minncolumns,
 		   int **column_type, int **column_length, int skip_lines,
-		   int xcol, int ycol, int region_flag)
+		   int xcol, int ycol, int region_flag, int table_only )
 {
     int i;
     int buflen;			/* buffer length */
@@ -138,6 +142,8 @@
 	/* Determine column types */
 	for (i = 0; i < ntokens; i++) {
 	    if ((G_projection() == PROJECTION_LL)) {
+	    
+	       if (!table_only) {
 		if (i == xcol || i == ycol) {
 		    if (i == 0) {	/* Save position of original internal token buffer */
 			/* Prevent memory leaks */
@@ -177,6 +183,8 @@
 			    G_fatal_error(_("Unparsable latitude value: %s"), tokens[i]);
 		    }
  		} /* if (x or y) */
+	      }
+		
 
 		if (i == ntokens - 1 && sav_buf != NULL) {
 		    /* Restore original token buffer so free_tokens works */
@@ -185,7 +193,7 @@
 		    sav_buf = NULL;
 		}
 	    }		/* PROJECTION_LL */
-	    else {
+	    else {	      
 		if (region_flag) {
 		    /* consider z range if -z flag is used? */
 		    /* change to if(>= east,north){skip=1;} to allow correct tiling */
@@ -263,7 +271,7 @@
 int points_to_bin(FILE * ascii, int rowlen, struct Map_info *Map,
 		  dbDriver * driver, char *table, char *fs, int ncols,
 		  int *coltype, int xcol, int ycol, int zcol, int catcol,
-		  int skip_lines)
+		  int skip_lines, int table_only )
 {
     char *buf, buf2[1000];
     int cat = 0;
@@ -296,13 +304,15 @@
 	char **tokens;
 	int ntokens;		/* number of tokens */
 
-	if (row <= skip_lines) {
-	    G_debug(4, "writing skip line %d to hist : %d chars", row,
-		    (int) strlen(buf));
-	    Vect_hist_write(Map, buf);
-	    Vect_hist_write(Map, "\n");
-	    row++;
-	    continue;
+	if (!table_only) {
+	  if (row <= skip_lines) {
+	      G_debug(4, "writing skip line %d to hist : %d chars", row,
+		      (int) strlen(buf));
+	      Vect_hist_write(Map, buf);
+	      Vect_hist_write(Map, "\n");
+	      row++;
+	      continue;
+	  }
 	}
 
 	len = strlen(buf);
@@ -314,33 +324,39 @@
 	tokens = G_tokenize(buf, fs);
 	ntokens = G_number_of_tokens(tokens);
 
-	if ((G_projection() == PROJECTION_LL)) {
-	    G_scan_easting(tokens[xcol], &x, window.proj);
-	    G_scan_northing(tokens[ycol], &y, window.proj);
-	}
-	else {
-	    x = atof(tokens[xcol]);
-	    y = atof(tokens[ycol]);
-	}
-	G_debug(4, "x: %f, y: %f", x, y);
 
-	if (zcol >= 0)
-	    z = atof(tokens[zcol]);
-	else
-	    z = 0.0;
+	if ( !table_only ) {
+	  if ((G_projection() == PROJECTION_LL)) {
+	      G_scan_easting(tokens[xcol], &x, window.proj);
+	      G_scan_northing(tokens[ycol], &y, window.proj);
+	  }
+	  else {
+	      x = atof(tokens[xcol]);
+	      y = atof(tokens[ycol]);
+	  }
+	  G_debug(4, "x: %f, y: %f", x, y);
+
+	  if (zcol >= 0)
+	      z = atof(tokens[zcol]);
+	  else
+	      z = 0.0;
 
+	}
+	
 	if (catcol >= 0)
 	    cat = atof(tokens[catcol]);
 	else
 	    cat++;
 
-	Vect_reset_line(Points);
-	Vect_reset_cats(Cats);
+	if (!table_only) {
+	  Vect_reset_line(Points);
+	  Vect_reset_cats(Cats);
 
-	Vect_append_point(Points, x, y, z);
-	Vect_cat_set(Cats, 1, cat);
+	  Vect_append_point(Points, x, y, z);
+	  Vect_cat_set(Cats, 1, cat);
 
-	Vect_write_line(Map, GV_POINT, Points, Cats);
+	  Vect_write_line(Map, GV_POINT, Points, Cats);
+	}
 
 	/* Attributes */
 	if (driver) {
_______________________________________________
grass-dev mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/grass-dev

Reply via email to