From: Sandro Santilli Date: Thu, 31 Mar 2011 10:26:41 +0000 (+0000) Subject: topology.TopologSummary: survive presence of stale records in topology.topology and... X-Git-Tag: 2.0.0alpha1~1809 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c29a7210164b739fe613cdc850d1e8476c594a33;p=postgis topology.TopologSummary: survive presence of stale records in topology.topology and missing tables from topology schemas. git-svn-id: http://svn.osgeo.org/postgis/trunk@6993 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/topology/sql/manage/TopologySummary.sql b/topology/sql/manage/TopologySummary.sql index 85b8d01ae..18ece4309 100644 --- a/topology/sql/manage/TopologySummary.sql +++ b/topology/sql/manage/TopologySummary.sql @@ -27,42 +27,71 @@ DECLARE ret text; BEGIN - SELECT * FROM topology.topology WHERE name = atopology INTO STRICT rec; - -- TODO: catch 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 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