Bläddra i källkod

wxGUI/iclass: speed-up exporting areas (update statements in one transaction)

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@58742 15284696-431f-4ddb-bdfa-cd5b030d7da7
Martin Landa 11 år sedan
förälder
incheckning
e76c11ac01
1 ändrade filer med 28 tillägg och 19 borttagningar
  1. 28 19
      gui/wxpython/iclass/frame.py

+ 28 - 19
gui/wxpython/iclass/frame.py

@@ -736,44 +736,53 @@ class IClassMapFrame(DoubleMapFrame):
             wx.EndBusyCursor()
             return False
         
+        try:
+            dbInfo =  grass.vector_db(vectorName)[1]
+        except KeyError:
+            wx.EndBusyCursor()
+            return False
+        
+        dbFile = tempfile.NamedTemporaryFile(mode = 'w+b')
+        if dbInfo['driver'] != 'dbf':
+            dbFile.write("BEGIN\n")
         # populate table
         for cat in self.stats_data.GetCategories():
             stat = self.stats_data.GetStatistics(cat)
             
-            self._runDBUpdate(map = vectorName, column = "class", value = stat.name, cat = cat)
-            self._runDBUpdate(map = vectorName, column = "color", value = stat.color, cat = cat)
+            self._runDBUpdate(dbFile, table = dbInfo['table'], column = "class", value = stat.name, cat = cat)
+            self._runDBUpdate(dbFile, table = dbInfo['table'], column = "color", value = stat.color, cat = cat)
             
             if not stat.IsReady():
                 continue
                 
-            self._runDBUpdate(map = vectorName, column = "n_cells",value = stat.ncells, cat = cat)
+            self._runDBUpdate(dbFile, table = dbInfo['table'], column = "n_cells",value = stat.ncells, cat = cat)
             
             for i in range(nbands):
-                self._runDBUpdate(map = vectorName, column = "band%d_min" % (i + 1), value = stat.bands[i].min, cat = cat)
-                self._runDBUpdate(map = vectorName, column = "band%d_mean" % (i + 1), value = stat.bands[i].mean, cat = cat)
-                self._runDBUpdate(map = vectorName, column = "band%d_max" % (i + 1), value = stat.bands[i].max, cat = cat)
+                self._runDBUpdate(dbFile, table = dbInfo['table'], column = "band%d_min" % (i + 1), value = stat.bands[i].min, cat = cat)
+                self._runDBUpdate(dbFile, table = dbInfo['table'], column = "band%d_mean" % (i + 1), value = stat.bands[i].mean, cat = cat)
+                self._runDBUpdate(dbFile, table = dbInfo['table'], column = "band%d_max" % (i + 1), value = stat.bands[i].max, cat = cat)
                 
+        if dbInfo['driver'] != 'dbf':
+            dbFile.write("COMMIT\n")
+
+        if 0 != RunCommand('db.execute', input=dbFile.name):
+            wx.EndBusyCursor()
+            return False
+
         wx.EndBusyCursor()
         return True
     
-    def _runDBUpdate(self, map, column, value, cat):
-        """!Helper function for calling v.db.update.
+    def _runDBUpdate(self, tmpFile, table, column, value, cat):
+        """!Helper function for UPDATE statement
         
-        @param map vector map name
+        @param tmpFile file where to write UPDATE statements
+        @param table table name
         @param column name of updated column
         @param value new value
         @param cat which category to update
-        
-        @return returncode (0 is OK)
         """
-        ret = RunCommand('v.db.update',
-                        map = map,
-                        layer = 1,
-                        column = column,
-                        value = value,
-                        where = "cat = %d" % cat)
-                            
-        return ret
+        tmpFile.write("UPDATE %s SET %s = %s WHERE cat = %d\n" %
+                      (table, column, value, cat))
         
     def OnCategoryManager(self, event):
         """!Show category management dialog"""