Updating Mapinfo MapCatalog table in the SDW V1.5
These set of trigger functions are useful for populating the mapinfo_mapcatalog table in the SDW. The first two look for changes in the geometry_columns table and run the at_sync_mapinfo_mapcatalog trigger. This look for changes in geometry_columns and updates mapinfo_mapcatalog accordingly and applies default styling dependent of the geometry type.
at_sync_mapinfo_mapcatalog()
-- Function: at_sync_mapinfo_mapcatalog() -- DROP FUNCTION at_sync_mapinfo_mapcatalog(); CREATE OR REPLACE FUNCTION at_sync_mapinfo_mapcatalog() RETURNS trigger AS $BODY1$ --$BODY$ DECLARE r record; insertStr varchar; deleteStr varchar; spatialtype varchar; symbol varchar; projection varchar; count integer; message varchar; default_symbol_point varchar; default_symbol_line varchar; default_symbol_polygon varchar; -- default_symbol_mixed varchar; BEGIN -- extract default symbology from mapinfo_mapcatalog_configuration -- create some default defaults first in case table data doesn't exist default_symbol_point := 'SYMBOL (34,12632064,10) '; default_symbol_line := 'PEN (1, 2, 0) '; default_symbol_polygon := 'PEN (1, 2, 8388608) BRUSH (16, 16776960, 16777215) '; -- default_symbol_mixed := 'SYMBOL (34,12632064,10) PEN (1, 2, 8388608) BRUSH (16, 16776960, 16777215) '; FOR r in SELECT * FROM mapinfo.mapinfo_mapcatalog_configuration LOOP IF (r.setting_name = 'SYMBOL_POINT') THEN default_symbol_point := r.setting_value; END IF; IF (r.setting_name = 'SYMBOL_LINE') THEN default_symbol_line := r.setting_value; END IF; IF (r.setting_name = 'SYMBOL_POLYGON') THEN default_symbol_polygon := r.setting_value; END IF; --IF (r."SETTING_NAME" = 'SYMBOL_MIXED') THEN -- default_symbol_mixed := r."SETTING_VALUE"; --END IF; END LOOP; -- first, select entries in geometry_columns which don't exist in mapinfo_mapcatalog -- and add them to mapinfo_mapcatalog count := 0; FOR r in SELECT * FROM geometry_columns T2 WHERE NOT EXISTS (SELECT * FROM mapinfo.mapinfo_mapcatalog T1 WHERE T1.ownername = T2.f_table_schema AND T1.tablename = T2.f_table_name) LOOP spatialtype := '19.3'; symbol := default_symbol_point || default_symbol_polygon; IF (r.type = 'LINESTRING' OR r.type = 'MULTILINESTRING') THEN spatialtype := '19.1'; symbol := default_symbol_line; END IF; IF (r.type = 'POLYGON' OR r.type = 'MULTIPOLYGON') THEN spatialtype := '19.2'; symbol := default_symbol_polygon; END IF; IF (r.type = 'POINT' OR r.type = 'MULTIPOINT') THEN spatialtype := '19'; symbol := default_symbol_point; END IF; projection := E'Earth Projection 8, 79, "m", -2, 49, 0.9996012717, 400000, -100000 Bounds (-7845061.1011, -15524202.1641) (8645061.1011, 4470074.53373)'; insertStr := E'INSERT INTO mapinfo.mapinfo_mapcatalog (' || 'spatialtype, tablename, ownername, spatialcolumn, db_x_ll, db_y_ll, ' || 'db_x_ur, db_y_ur, view_x_ll, view_y_ll, view_x_ur, view_y_ur, coordinatesystem, symbol, xcolumnname, ' || 'ycolumnname, renditiontype, renditiontable) ' || 'VALUES (' || spatialtype || E',\'' || r.f_table_name || E'\', \'' || r.f_table_schema || E'\', \'' || r.f_geometry_column || E'\', 0, 0, ' || E'700000, 1300000, 0, 0, 700000, 1300000, \'' || projection || E'\', \'' || symbol || E'\', \'NO_COLUMN\', ' || E'\'NO_COLUMN\', 0, \'\');'; EXECUTE insertStr; count := count + 1; END LOOP; message := count || ' inserted, '; -- second, delete entries in mapinfo_mapcatalog which don't exist in geometry_columns count := 0; FOR r in SELECT * FROM mapinfo.mapinfo_mapcatalog T1 WHERE NOT EXISTS (SELECT * FROM geometry_columns T2 WHERE T1.ownername = T2.f_table_schema AND T1.tablename = T2.f_table_name) LOOP deleteStr := E'DELETE FROM mapinfo.mapinfo_mapcatalog WHERE ownername = \'' || r.ownername || E'\' AND tablename = \'' || r.tablename || E'\';'; EXECUTE deleteStr; count := count + 1; END LOOP; message := 'mapinfo_mapcatalog: ' || message || count || ' removed'; --return message; RETURN NULL; END; --$BODY$ $BODY1$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION at_sync_mapinfo_mapcatalog() OWNER TO postgres;
at_update_mapinfo_mapcatalog_trigger
-- Trigger: at_update_mapinfo_mapcatalog_trigger on geometry_columns -- DROP TRIGGER at_update_mapinfo_mapcatalog_trigger ON geometry_columns; CREATE TRIGGER at_update_mapinfo_mapcatalog_trigger AFTER INSERT OR UPDATE OR DELETE ON geometry_columns FOR EACH ROW EXECUTE PROCEDURE at_sync_mapinfo_mapcatalog();
at_update_mapinfo_mapcatalog_trigger_truncate
-- Trigger: at_update_mapinfo_mapcatalog_trigger_truncate on geometry_columns -- DROP TRIGGER at_update_mapinfo_mapcatalog_trigger_truncate ON geometry_columns; CREATE TRIGGER at_update_mapinfo_mapcatalog_trigger_truncate AFTER TRUNCATE ON geometry_columns FOR EACH STATEMENT EXECUTE PROCEDURE at_sync_mapinfo_mapcatalog();