]> granicus.if.org Git - postgis/commitdiff
topology.TopologSummary: survive presence of stale records in topology.topology and...
authorSandro Santilli <strk@keybit.net>
Thu, 31 Mar 2011 10:26:41 +0000 (10:26 +0000)
committerSandro Santilli <strk@keybit.net>
Thu, 31 Mar 2011 10:26:41 +0000 (10:26 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@6993 b70326c6-7e19-0410-871a-916f4a2858ee

topology/sql/manage/TopologySummary.sql

index 85b8d01aef5b4d7d59738ccde66ff36bdf9811c4..18ece4309631da4053627c34264b5827e8392f93 100644 (file)
@@ -27,42 +27,71 @@ DECLARE
   ret text;
 BEGIN
 
-  SELECT * FROM topology.topology WHERE name = atopology INTO STRICT rec;
-  -- TODO: catch <no_rows> to give a nice error message
-  topology_id := rec.id;
+  ret := 'Topology ' || quote_ident(atopology) ;
 
-  ret := 'Topology ' || quote_ident(atopology) 
-      || ' (' || rec.id || '), ';
-  ret := ret || 'SRID ' || rec.srid || ', '
-             || 'precision ' || rec.precision;
-  IF rec.hasz THEN ret := ret || ', has Z'; END IF;
-  ret := ret || E'\n';
+  BEGIN
+    SELECT * FROM topology.topology WHERE name = atopology INTO STRICT rec;
+    -- TODO: catch <no_rows> to give a nice error message
+    topology_id := rec.id;
 
-  EXECUTE 'SELECT count(node_id) FROM ' || quote_ident(atopology)
-    || '.node ' INTO STRICT n;
-  ret = ret || n || ' nodes, ';
+    ret := ret || ' (' || rec.id || '), ';
+    ret := ret || 'SRID ' || rec.srid || ', '
+               || 'precision ' || rec.precision;
+    IF rec.hasz THEN ret := ret || ', has Z'; END IF;
+    ret := ret || E'\n';
+  EXCEPTION
+    WHEN NO_DATA_FOUND THEN
+      ret := ret || E' (X)\n';
+  END;
 
-  EXECUTE 'SELECT count(edge_id) FROM ' || quote_ident(atopology)
-    || '.edge_data ' INTO STRICT n;
-  ret = ret || n || ' edges, ';
+  BEGIN
 
-  EXECUTE 'SELECT count(face_id) FROM ' || quote_ident(atopology)
-    || '.face ' INTO STRICT n;
-  ret = ret || n || ' faces, ';
+  BEGIN
+    EXECUTE 'SELECT count(node_id) FROM ' || quote_ident(atopology)
+      || '.node ' INTO STRICT n;
+    ret = ret || n || ' nodes, ';
+  EXCEPTION
+    WHEN UNDEFINED_TABLE OR INVALID_SCHEMA_NAME THEN
+      ret = ret || 'X nodes, ';
+  END;
 
-  EXECUTE 'SELECT count(*) FROM (SELECT DISTINCT layer_id,topogeo_id FROM '
-    || quote_ident(atopology) || '.relation ) foo ' INTO STRICT n;
-  ret = ret || n || ' topogeoms in ';
+  BEGIN
+    EXECUTE 'SELECT count(edge_id) FROM ' || quote_ident(atopology)
+      || '.edge_data ' INTO STRICT n;
+    ret = ret || n || ' edges, ';
+  EXCEPTION
+    WHEN UNDEFINED_TABLE OR INVALID_SCHEMA_NAME THEN
+      ret = ret || 'X edges, ';
+  END;
 
-  EXECUTE 'SELECT count(*) FROM (SELECT DISTINCT layer_id FROM '
-    || quote_ident(atopology) || '.relation ) foo ' INTO STRICT n;
-  ret = ret || n || ' layers' || E'\n';
+  BEGIN
+    EXECUTE 'SELECT count(face_id) FROM ' || quote_ident(atopology)
+      || '.face ' INTO STRICT n;
+    ret = ret || n || ' faces, ';
+  EXCEPTION
+    WHEN UNDEFINED_TABLE OR INVALID_SCHEMA_NAME THEN
+      ret = ret || 'X faces, ';
+  END;
+
+  BEGIN
+
+    EXECUTE 'SELECT count(*) FROM (SELECT DISTINCT layer_id,topogeo_id FROM '
+      || quote_ident(atopology) || '.relation ) foo ' INTO STRICT n;
+    ret = ret || n || ' topogeoms in ';
+
+    EXECUTE 'SELECT count(*) FROM (SELECT DISTINCT layer_id FROM '
+      || quote_ident(atopology) || '.relation ) foo ' INTO STRICT n;
+    ret = ret || n || ' layers' || E'\n';
+  EXCEPTION
+    WHEN UNDEFINED_TABLE OR INVALID_SCHEMA_NAME THEN
+      ret = ret || 'X topogeoms in X layers' || E'\n';
+  END;
 
   -- TODO: print informations about layers
   FOR rec IN SELECT * FROM topology.layer l
     WHERE l.topology_id = topology_id
     ORDER by layer_id
-  LOOP
+  LOOP -- {
     ret = ret || 'Layer ' || rec.layer_id || ', type ';
     CASE
       WHEN rec.feature_type = 1 THEN
@@ -75,29 +104,45 @@ BEGIN
         ret = ret || '???';
     END CASE;
 
-    EXECUTE 'SELECT count(*) FROM ( SELECT DISTINCT topogeo_id FROM '
-      || quote_ident(atopology)
-      || '.relation r WHERE r.layer_id = ' || rec.layer_id
-      || ' ) foo ' INTO STRICT n;
-
-    ret = ret || ' (' || rec.feature_type || E'), '
-              || n || ' topogeoms' || E'\n';
-
-    IF rec.level > 0 THEN
-      ret = ret || ' Hierarchy level ' || rec.level 
-                || ', child layer ' || rec.child_id || E'\n';
-    END IF;
-
-    ret = ret || ' Deploy: ';
-    IF rec.feature_column != '' THEN
-      ret = ret || quote_ident(rec.schema_name) || '.'
-                || quote_ident(rec.table_name) || '.'
-                || quote_ident(rec.feature_column)
-                || E'\n';
-    ELSE
-      ret = ret || E'NONE (detached)\n';
-    END IF;
-  END LOOP;
+    ret = ret || ' (' || rec.feature_type || '), ';
+
+    BEGIN
+
+      EXECUTE 'SELECT count(*) FROM ( SELECT DISTINCT topogeo_id FROM '
+        || quote_ident(atopology)
+        || '.relation r WHERE r.layer_id = ' || rec.layer_id
+        || ' ) foo ' INTO STRICT n;
+
+      ret = ret || n || ' topogeoms' || E'\n';
+
+    EXCEPTION WHEN UNDEFINED_TABLE THEN
+      ret = ret || 'X topogeoms' || E'\n';
+    END;
+
+      IF rec.level > 0 THEN
+        ret = ret || ' Hierarchy level ' || rec.level 
+                  || ', child layer ' || rec.child_id || E'\n';
+      END IF;
+
+      ret = ret || ' Deploy: ';
+      IF rec.feature_column != '' THEN
+        ret = ret || quote_ident(rec.schema_name) || '.'
+                  || quote_ident(rec.table_name) || '.'
+                  || quote_ident(rec.feature_column)
+                  || E'\n';
+      ELSE
+        ret = ret || E'NONE (detached)\n';
+      END IF;
+
+  END LOOP; -- }
+
+  EXCEPTION
+    WHEN INVALID_SCHEMA_NAME THEN
+      ret = ret || E'\n- missing schema - ';
+    WHEN OTHERS THEN
+      RAISE EXCEPTION 'Got % (%)', SQLERRM, SQLSTATE;
+  END;
+
 
   RETURN ret;
 END