From 4f8e195b5fcb241bd1acd861c2126576ec0dc4a1 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Mon, 15 Sep 2025 12:15:05 +0200 Subject: [PATCH 1/2] add example for delete callback --- flex-config/track-changes.lua | 80 +++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 flex-config/track-changes.lua diff --git a/flex-config/track-changes.lua b/flex-config/track-changes.lua new file mode 100644 index 000000000..cf9e3a094 --- /dev/null +++ b/flex-config/track-changes.lua @@ -0,0 +1,80 @@ +-- This config example file is released into the Public Domain. + +-- This config shows how to track in a table which OSM object have been +-- added, changed and deleted. + +-- The main table logging the changes. +local change_table = osm2pgsql.define_table{ + name = 'change_log', + -- Disable automatic ID tracking by osm2pgsql. No rows should ever + -- be deleted. osm2pgsql will issue a warning about this. It can + -- be safely ignored. + ids = nil, + columns = { + { column = 'osm_type', type = 'text' }, + { column = 'osm_id', type = 'bigint' }, + { column = 'version', type = 'int' }, + -- This column describes the kind of change: + -- 'A' for added/newly created, + -- 'M' for modified, + -- 'D' for deleted + { column = 'action', type = 'text' }, + { column = 'date', sql_type = 'timestamp' } + }, + indexes = { + { column = { 'osm_type', 'osm_id' }, method = 'btree' } + } +} + +-- We only want to catch changes coming from the OSM file input. +-- This flag marks when file reading is done and dependent objects are +-- being processed. +local file_reading_in_progress = true + +local function format_date(ts) + return os.date('!%Y-%m-%dT%H:%M:%SZ', ts) +end + +local function add_object_change(object) + -- In this example only changes while updating the database are recorded. + -- This happens in 'append' mode. + if osm2pgsql.mode == 'append' and file_reading_in_progress then + change_table:insert{ + osm_type = object.type, + osm_id = object.id, + version = object.version, + action = (object.version == 1) and 'A' or 'M', + date = format_date(object.timestamp) + } + end +end + +osm2pgsql.process_node = add_object_change +osm2pgsql.process_way = add_object_change +osm2pgsql.process_relation = add_object_change + +osm2pgsql.process_untagged_node = add_object_change +osm2pgsql.process_untagged_way = add_object_change +osm2pgsql.process_untagged_relation = add_object_change + + +local function add_deleted_object(object) + change_table:insert{ + osm_type = object.type, + osm_id = object.id, + version = object.version, + action = 'D', + date = format_date(object.timestamp) + } +end + +osm2pgsql.process_deleted_node = add_deleted_object +osm2pgsql.process_deleted_way = add_deleted_object +osm2pgsql.process_deleted_relation = add_deleted_object + +function osm2pgsql.after_relations() + -- This callback is called after the last relation has been read from + -- the input file. As objects are guaranteed to come in order + -- node/way/relation, file reading is done at that point. + file_reading_in_progress = false +end From d87843d38e50700beb6b0c27145bd231726da01a Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Mon, 15 Sep 2025 12:18:53 +0200 Subject: [PATCH 2/2] add exceptions for more callbacks to luacheck --- .luacheckrc | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.luacheckrc b/.luacheckrc index 515ded21b..80507e2a6 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -29,12 +29,30 @@ stds.osm2pgsql = { process_untagged_relation = { read_only = false }, + process_deleted_node = { + read_only = false + }, + process_deleted_way = { + read_only = false + }, + process_deleted_relation = { + read_only = false + }, select_relation_members = { read_only = false }, process_gen = { read_only = false }, + after_nodes = { + read_only = false + }, + after_ways = { + read_only = false + }, + after_relations = { + read_only = false + }, }, other_fields = true, }