[GRASS-SVN] r51969 - grass/trunk/lib/vector/Vlib

svn_grass at osgeo.org svn_grass at osgeo.org
Mon Jun 4 06:03:54 PDT 2012


Author: mmetz
Date: 2012-06-04 06:03:51 -0700 (Mon, 04 Jun 2012)
New Revision: 51969

Modified:
   grass/trunk/lib/vector/Vlib/ascii.c
Log:
Vlib: speed up v.out.ascii for multiple column export

Modified: grass/trunk/lib/vector/Vlib/ascii.c
===================================================================
--- grass/trunk/lib/vector/Vlib/ascii.c	2012-06-04 09:33:20 UTC (rev 51968)
+++ grass/trunk/lib/vector/Vlib/ascii.c	2012-06-04 13:03:51 UTC (rev 51969)
@@ -317,13 +317,23 @@
     int count;
 
     /* where || columns */
-    struct field_info *Fi;
-    dbDriver *driver;
-    dbValue value = {0};
+    struct field_info *Fi = NULL;
+    dbDriver *driver = NULL;
+    dbValue value;
     dbHandle handle;
-    int *cats, ncats;
+    int *cats, ncats, more;
+    dbTable *Table;
+    dbString dbstring;
+    dbColumn *Column;
+    dbValue *Value;
+    char buf[2000];
+    dbCursor cursor;
     int *coltypes = NULL;
+    char *all_columns = NULL;
     
+    G_zero(&value, sizeof(dbValue));
+    db_init_string(&dbstring);
+
     /* TODO: free memory allocated by G_asprintf(),
      * this is a bad memory leak */
     xstring = NULL;
@@ -367,15 +377,32 @@
 	    db_shutdown_driver(driver);
 	}
 	else {
+	    int len_all = 0;
+
 	    i = 0;
-	    while (columns[i++]);
+	    while (columns[i])
+		len_all += strlen(columns[i++]);
 	    
 	    coltypes = G_malloc(i * sizeof(int));
+	    
+	    all_columns = G_malloc(len_all + i + 2);
 
 	    i = 0;
+	    strcpy(all_columns, columns[0]);
 	    while (columns[i]) {
 		/* get column types */
 		coltypes[i] = db_column_Ctype(driver, Fi->table, columns[i]);
+		if (coltypes[i] < 0) {
+		    db_close_database(driver);
+		    db_shutdown_driver(driver);
+		    G_warning(_("Unknown type of column <%s>, export cancelled"),
+		              columns[i]);
+		    return -1;
+		}
+		if (i > 0) {
+		    strcat(all_columns, ",");
+		    strcat(all_columns, columns[i]);
+		}
 		i++;
 	    }
 	}
@@ -399,6 +426,9 @@
 	    if (columns) {
 		db_close_database(driver);
 		db_shutdown_driver(driver);
+
+		G_free(coltypes);
+		G_free(all_columns);
 	    }
 	    
 	    return -1;
@@ -408,6 +438,9 @@
 	    if (columns) {
 		db_close_database(driver);
 		db_shutdown_driver(driver);
+
+		G_free(coltypes);
+		G_free(all_columns);
 	    }
 	    break;
 	}
@@ -554,28 +587,48 @@
 		
 		/* print attributes */
 		if (columns) {
+
+		    sprintf(buf, "SELECT %s FROM %s WHERE %s = %d",
+			    all_columns, Fi->table, Fi->key, fcats->value[0]);
+		    G_debug(2, "SQL: %s", buf);
+		    db_set_string(&dbstring, buf);
+
+		    if (db_open_select_cursor
+				    (driver, &dbstring, &cursor, DB_SEQUENTIAL) != DB_OK) {
+			db_close_database(driver);
+			db_shutdown_driver(driver);
+			G_fatal_error(_("Cannot select attributes for cat = %d"),
+			  fcats->value[0]);
+		    }
+		    if (db_fetch(&cursor, DB_NEXT, &more) != DB_OK) {
+			db_close_database(driver);
+			db_shutdown_driver(driver);
+			G_fatal_error(_("Unable to fetch data from table"));
+		    }
+
+		    Table = db_get_cursor_table(&cursor);
+
+
 		    for(i = 0; columns[i]; i++) {
-			if (db_select_value(driver, Fi->table, Fi->key, fcats->value[0],
-					    columns[i], &value) < 0)
-			    G_fatal_error(_("Unable to select record from table <%s> (key %s, column %s)"),
-					  Fi->table, Fi->key, columns[i]);
-			
-			if (db_test_value_isnull(&value)) {
+			Column = db_get_table_column(Table, i);
+			Value = db_get_column_value(Column);
+
+			if (db_test_value_isnull(Value)) {
 			    fprintf(ascii, "%s", fs);
 			}
 			else {
 			    switch(coltypes[i])
 			    {
 			    case DB_C_TYPE_INT: {
-				fprintf(ascii, "%s%d", fs, db_get_value_int(&value));
+				fprintf(ascii, "%s%d", fs, db_get_value_int(Value));
 				break;
 			    }
 			    case DB_C_TYPE_DOUBLE: {
-				fprintf(ascii, "%s%.*f", fs, dp, db_get_value_double(&value));
+				fprintf(ascii, "%s%.*f", fs, dp, db_get_value_double(Value));
 				break;
 			    }
 			    case DB_C_TYPE_STRING: {
-				fprintf(ascii, "%s%s", fs, db_get_value_string(&value));
+				fprintf(ascii, "%s%s", fs, db_get_value_string(Value));
 				break;
 			    }
 			    case DB_C_TYPE_DATETIME: {
@@ -589,6 +642,7 @@
 			    }
 			}
 		    }
+		    db_close_cursor(&cursor);
 		}
 	    }
 



More information about the grass-commit mailing list