pg-converter 2.0b0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pg_converter-2.0b0/LICENSE +21 -0
- pg_converter-2.0b0/MANIFEST.in +7 -0
- pg_converter-2.0b0/PKG-INFO +390 -0
- pg_converter-2.0b0/README.md +342 -0
- pg_converter-2.0b0/conf/pg_converter.conf.example +54 -0
- pg_converter-2.0b0/docs/ARCHITECTURE.md +395 -0
- pg_converter-2.0b0/docs/BUNDLED_PACKETS.md +168 -0
- pg_converter-2.0b0/docs/CONFIGURATION.md +338 -0
- pg_converter-2.0b0/docs/DIAGRAMS.md +528 -0
- pg_converter-2.0b0/docs/EXPORT_AND_HOOKS.md +360 -0
- pg_converter-2.0b0/docs/OPERATIONS.md +415 -0
- pg_converter-2.0b0/docs/PACKET_FORMAT.md +469 -0
- pg_converter-2.0b0/docs/PROGRAMMATIC_API.md +390 -0
- pg_converter-2.0b0/docs/ROADMAP.md +174 -0
- pg_converter-2.0b0/docs/SECURITY.md +355 -0
- pg_converter-2.0b0/docs/USE_CASES.md +373 -0
- pg_converter-2.0b0/pyproject.toml +90 -0
- pg_converter-2.0b0/setup.cfg +4 -0
- pg_converter-2.0b0/src/pg_converter/__init__.py +21 -0
- pg_converter-2.0b0/src/pg_converter/__main__.py +14 -0
- pg_converter-2.0b0/src/pg_converter/api.py +114 -0
- pg_converter-2.0b0/src/pg_converter/bundled/__init__.py +0 -0
- pg_converter-2.0b0/src/pg_converter/bundled/conf/pg_converter.conf.example +54 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/alert_bloat/01_step.sql +117 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/alert_bloat/02_step.sql +73 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/alert_bloat/meta_data.json +13 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/alert_check_autovacuum/01_step.sql +18 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/alert_check_autovacuum/meta_data.json +10 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/alert_int4_capacity/01_gen_obj.sql +22 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/alert_int4_capacity/01_step.sql +32 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/alert_int4_capacity/meta_data.json +14 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/alert_invalid_indexes/01_step.sql +8 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/alert_invalid_indexes/meta_data.json +12 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/alert_max_connections/01_step.sql +9 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/alert_max_connections/meta_data.json +13 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/alert_stat/01_step.sql +34 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/alert_stat/meta_data.json +13 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/alert_xact_age/01_step.sql +11 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/alert_xact_age/02_step.sql +7 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/alert_xact_age/meta_data.json +13 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_active_maint/01_step.sql +34 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_active_maint/meta_data.json +11 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_clone_schema/01_step.sql +433 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_clone_schema/meta_data.json +4 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_find_db/01_step.sql +1 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_find_db/meta_data.json +5 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_get_conf/01_step.sql +32 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_get_conf/meta_data.json +5 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_get_version/01_step.sql +1 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_get_version/meta_data.json +11 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_idx_diag/01_step.sql +21 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_idx_diag/02_step.sql +16 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_idx_diag/03_step.sql +16 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_idx_diag/04_step.sql +23 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_idx_diag/05_step.sql +29 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_idx_diag/06_step.sql +46 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_idx_diag/07_step.sql +36 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_idx_diag/08_step.sql +12 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_idx_diag/09_step.sql +18 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_idx_diag/10_step.sql +20 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_idx_diag/meta_data.json +5 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_lag/01_step.sql +8 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_lag/meta_data.json +11 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_locks/01_step.sql +23 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_locks/meta_data.json +11 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_long_queries/01_step.sql +22 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_long_queries/meta_data.json +11 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_top_tables/01_step.sql +56 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_top_tables/meta_data.json +11 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_xact_age/01_step.sql +10 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/dba_xact_age/meta_data.json +11 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_blocker_tx/01_step.sql +6 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_blocker_tx/02_step.sql +5 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_blocker_tx/meta_data.json +12 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_common/01_step.sql +8 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_common/02_gen_obj.sql +32 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_common/02_step.sql +3 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_common/03_gen_nsp.sql +7 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_common/03_step.sql +3 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_common/04_gen_nsp.sql +7 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_common/04_gen_obj.sql +8 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_common/04_step.sql +3 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_common/05_step.sql +8 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_common/06_step.sql +8 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_common/meta_data.json +6 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_dba_clone_schema/01_step.sql +47 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_dba_clone_schema/02_step.sql +11 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_dba_clone_schema/03_step.sql +11 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_dba_clone_schema/meta_data.json +5 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_dba_idx_diag/00_prepare.sql +128 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_dba_idx_diag/01_step.sql_out +41 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_dba_idx_diag/02_step.sql_out +15 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_dba_idx_diag/03_step.sql_out +17 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_dba_idx_diag/04_step.sql_out +58 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_dba_idx_diag/05_step.sql_out +99 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_dba_idx_diag/06_step.sql_out +31 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_dba_idx_diag/07_step.sql_out +24 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_dba_idx_diag/08_step.sql_out +8 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_dba_idx_diag/09_step.sql_out +16 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_dba_idx_diag/10_step.sql_out +16 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_export_data/01_test.sql +22 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_export_data/02_test.sql +2 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_export_data/meta_data.json +9 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_gens/00_step.sql +21 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_gens/01_gen_nsp.sql +7 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_gens/01_gen_obj.sql +8 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_gens/01_step.sql +3 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_gens/02_gen_nsp.sql +7 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_gens/02_step.sql +3 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_gens/03_gen_obj.sql +7 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_gens/03_step.sql +3 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_gens/meta_data.json +7 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_get_version/01_step.sql +1 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_get_version/meta_data.json +11 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_insert_delete_select/01_step.sql +5 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_insert_delete_select/meta_data.json +12 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_insert_info/01_step.sql +11 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_insert_info/meta_data.json +11 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_int4_to_int8/01_step.sql +33 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_int4_to_int8/02_gen_obj.sql +28 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_int4_to_int8/02_step.sql +7 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_int4_to_int8/03_step.sql +5 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_int4_to_int8/04_step.sql +14 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_int4_to_int8/05_step.sql +2 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_int4_to_int8/06_step.sql +16 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_int4_to_int8/07_step.sql +2 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_int4_to_int8/meta_data.json +5 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_int4_to_int8/run_once.sql +12 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_maint/01_step.sql +1 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_maint/02_step.sql +1 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_maint/03_step.sql +5 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_maint/04_step.sql +1 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_maint/05_step.sql +3 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_maint/06_step.sql +1 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_maint/meta_data.json +12 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_override_conf_param/01_step.sql +1 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_override_conf_param/meta_data.json +4 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_placeholders/00_step.sql +3 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_placeholders/01_gen_obj.sql +3 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_placeholders/01_step.sql +3 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_placeholders/meta_data.json +3 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_prepare_dbs/01_gen_obj.sql +25 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_prepare_dbs/01_step.sql +1 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_prepare_dbs/meta_data.json +4 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_py_step/01_step.sql +9 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_py_step/02_step.py +15 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_py_step/data/data_a.txt +1 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_py_step/data/data_b.txt +1 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_py_step/meta_data.json +5 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_raise/01_step.sql +8 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_raise/meta_data.json +10 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_read_only/01_step.sql +12 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_read_only/meta_data.json +12 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_read_only_exception/01_step.sql +12 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_read_only_exception/meta_data.json +4 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_read_only_gens/01_gen_nsp.sql +7 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_read_only_gens/01_gen_obj.sql +8 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_read_only_gens/01_step.sql +3 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_read_only_gens/02_gen_nsp.sql +7 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_read_only_gens/02_step.sql +3 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_read_only_gens/03_gen_obj.sql +7 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_read_only_gens/03_step.sql +3 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_read_only_gens/meta_data.json +7 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_read_only_raise/01_step.sql +8 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_read_only_raise/meta_data.json +10 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_skip_action_cancel/01_step.sql +5 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_skip_action_cancel/02_gen_obj.sql +8 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_skip_action_cancel/02_step.sql +3 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_skip_action_cancel/03_step.sql +5 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_skip_action_cancel/meta_data.json +4 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_skip_step_cancel/01_step.sql +5 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_skip_step_cancel/02_step.sql +5 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_skip_step_cancel/03_step.sql +5 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_skip_step_cancel/meta_data.json +4 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_sleep/01_step.sql +5 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_sleep/meta_data.json +5 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_sleep_sigint/01_step.sql +5 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_sleep_sigint/02_step.sql +5 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_sleep_sigint/meta_data.json +5 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_syntax_exception/01_step.sql +5 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_template/02_gen_obj.sql +32 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_template/02_step.sql +3 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_template/03_gen_nsp.sql +7 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_template/03_step.sql +3 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_unique_exception/01_step.sql +6 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_unique_exception/meta_data.json +11 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_wait_tx/01_step.sql +6 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_wait_tx/02_step.sql +1 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_wait_tx/03_step.sql +1 -0
- pg_converter-2.0b0/src/pg_converter/bundled/packets/test_wait_tx/meta_data.json +12 -0
- pg_converter-2.0b0/src/pg_converter/cli.py +173 -0
- pg_converter-2.0b0/src/pg_converter/config.py +388 -0
- pg_converter-2.0b0/src/pg_converter/core/__init__.py +103 -0
- pg_converter-2.0b0/src/pg_converter/core/constants.py +114 -0
- pg_converter-2.0b0/src/pg_converter/core/context.py +212 -0
- pg_converter-2.0b0/src/pg_converter/core/database.py +433 -0
- pg_converter-2.0b0/src/pg_converter/core/events.py +70 -0
- pg_converter-2.0b0/src/pg_converter/core/executor.py +813 -0
- pg_converter-2.0b0/src/pg_converter/core/failures.py +269 -0
- pg_converter-2.0b0/src/pg_converter/core/lock_observer.py +396 -0
- pg_converter-2.0b0/src/pg_converter/core/packet.py +440 -0
- pg_converter-2.0b0/src/pg_converter/core/python_executor.py +256 -0
- pg_converter-2.0b0/src/pg_converter/core/session.py +248 -0
- pg_converter-2.0b0/src/pg_converter/core/tracker.py +597 -0
- pg_converter-2.0b0/src/pg_converter/logging_config.py +513 -0
- pg_converter-2.0b0/src/pg_converter/resources.py +26 -0
- pg_converter-2.0b0/src/pg_converter/runner.py +1587 -0
- pg_converter-2.0b0/src/pg_converter/utils/__init__.py +50 -0
- pg_converter-2.0b0/src/pg_converter/utils/common.py +171 -0
- pg_converter-2.0b0/src/pg_converter/utils/export.py +217 -0
- pg_converter-2.0b0/src/pg_converter/utils/signals.py +173 -0
- pg_converter-2.0b0/src/pg_converter/utils/webhooks.py +448 -0
- pg_converter-2.0b0/src/pg_converter.egg-info/PKG-INFO +390 -0
- pg_converter-2.0b0/src/pg_converter.egg-info/SOURCES.txt +238 -0
- pg_converter-2.0b0/src/pg_converter.egg-info/dependency_links.txt +1 -0
- pg_converter-2.0b0/src/pg_converter.egg-info/entry_points.txt +2 -0
- pg_converter-2.0b0/src/pg_converter.egg-info/requires.txt +25 -0
- pg_converter-2.0b0/src/pg_converter.egg-info/top_level.txt +1 -0
- pg_converter-2.0b0/tests/README.md +309 -0
- pg_converter-2.0b0/tests/__init__.py +4 -0
- pg_converter-2.0b0/tests/bundled_packet_manifest.py +47 -0
- pg_converter-2.0b0/tests/conftest.py +161 -0
- pg_converter-2.0b0/tests/integration/__init__.py +1 -0
- pg_converter-2.0b0/tests/integration/test_postgresql_matrix.py +1173 -0
- pg_converter-2.0b0/tests/integration/test_ssl.py +165 -0
- pg_converter-2.0b0/tests/test_api.py +108 -0
- pg_converter-2.0b0/tests/test_bundled_packet_manifest.py +27 -0
- pg_converter-2.0b0/tests/test_cli.py +232 -0
- pg_converter-2.0b0/tests/test_config.py +246 -0
- pg_converter-2.0b0/tests/test_constants.py +176 -0
- pg_converter-2.0b0/tests/test_context.py +19 -0
- pg_converter-2.0b0/tests/test_database.py +569 -0
- pg_converter-2.0b0/tests/test_failures.py +112 -0
- pg_converter-2.0b0/tests/test_lock_observer.py +74 -0
- pg_converter-2.0b0/tests/test_packet.py +455 -0
- pg_converter-2.0b0/tests/test_postgresql_integration.py +250 -0
- pg_converter-2.0b0/tests/test_runner.py +163 -0
- pg_converter-2.0b0/tests/test_session.py +162 -0
- pg_converter-2.0b0/tests/test_tracker.py +176 -0
- pg_converter-2.0b0/tests/test_utils.py +320 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2020 Oleg Gurov
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pg-converter
|
|
3
|
+
Version: 2.0b0
|
|
4
|
+
Summary: Asynchronous PostgreSQL packet migration and operations tool
|
|
5
|
+
Author-email: O2eg <oleg.ispu@yandex.ru>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/O2eg/pg_converter
|
|
8
|
+
Project-URL: Repository, https://github.com/O2eg/pg_converter
|
|
9
|
+
Project-URL: Issues, https://github.com/O2eg/pg_converter/issues
|
|
10
|
+
Keywords: postgresql,migration,database,dba,asyncio
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Intended Audience :: System Administrators
|
|
15
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Topic :: Database
|
|
22
|
+
Classifier: Topic :: System :: Systems Administration
|
|
23
|
+
Requires-Python: >=3.10
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
License-File: LICENSE
|
|
26
|
+
Requires-Dist: asyncpg<1,>=0.27
|
|
27
|
+
Requires-Dist: sqlparse<1,>=0.5
|
|
28
|
+
Provides-Extra: test
|
|
29
|
+
Requires-Dist: pytest<9,>=7; extra == "test"
|
|
30
|
+
Requires-Dist: pytest-asyncio<1,>=0.21; extra == "test"
|
|
31
|
+
Requires-Dist: pytest-mock<4,>=3.10; extra == "test"
|
|
32
|
+
Provides-Extra: export
|
|
33
|
+
Requires-Dist: pyzipper<1,>=0.3.5; extra == "export"
|
|
34
|
+
Provides-Extra: webhooks
|
|
35
|
+
Requires-Dist: aiohttp<4,>=3.8; extra == "webhooks"
|
|
36
|
+
Provides-Extra: dev
|
|
37
|
+
Requires-Dist: build<2,>=1.2; extra == "dev"
|
|
38
|
+
Requires-Dist: black>=23; extra == "dev"
|
|
39
|
+
Requires-Dist: flake8>=6; extra == "dev"
|
|
40
|
+
Requires-Dist: isort>=5.12; extra == "dev"
|
|
41
|
+
Requires-Dist: mypy>=1; extra == "dev"
|
|
42
|
+
Requires-Dist: pytest<9,>=7; extra == "dev"
|
|
43
|
+
Requires-Dist: pytest-asyncio<1,>=0.21; extra == "dev"
|
|
44
|
+
Requires-Dist: pytest-cov>=4; extra == "dev"
|
|
45
|
+
Requires-Dist: pytest-mock<4,>=3.10; extra == "dev"
|
|
46
|
+
Requires-Dist: twine<7,>=6; extra == "dev"
|
|
47
|
+
Dynamic: license-file
|
|
48
|
+
|
|
49
|
+
# PG Converter
|
|
50
|
+
|
|
51
|
+
`pg_converter` 2.0 beta runs SQL and Python packets against one or more PostgreSQL
|
|
52
|
+
databases. It retains the original packet execution model under the `pgc_*`
|
|
53
|
+
tracker and `PGC_PL_*` placeholder namespaces. The threaded runtime has been
|
|
54
|
+
replaced with `asyncio` and `asyncpg`; bounded retry, reconnection, SSL/mTLS,
|
|
55
|
+
and a programmatic API for a future UI have been added.
|
|
56
|
+
|
|
57
|
+
The repository contains every original packet: 46 directories and 167 files.
|
|
58
|
+
The Python-step example uses the asynchronous API, and hook metadata uses the
|
|
59
|
+
`pg_converter` username. SQL, generator, tracker, and action behavior is
|
|
60
|
+
retained with PG Converter 2.0 names.
|
|
61
|
+
|
|
62
|
+
## Project status
|
|
63
|
+
|
|
64
|
+
The core runtime and original packet contract are tested on PostgreSQL 10-18.
|
|
65
|
+
The wheel and source distribution include the complete bundled packet tree,
|
|
66
|
+
the configuration example, package metadata, and license. Remaining
|
|
67
|
+
stabilization work includes:
|
|
68
|
+
|
|
69
|
+
- programmatic JSON contracts are not yet versioned;
|
|
70
|
+
- concurrent database tasks do not yet have a configurable upper bound;
|
|
71
|
+
- several logging settings are loaded but are not yet connected to the CLI
|
|
72
|
+
renderer;
|
|
73
|
+
- production fixtures for non-standard deployed tracker revisions are still
|
|
74
|
+
being collected.
|
|
75
|
+
|
|
76
|
+
The remaining work and stable-release criteria are recorded in the
|
|
77
|
+
[roadmap](docs/ROADMAP.md).
|
|
78
|
+
|
|
79
|
+
## Documentation
|
|
80
|
+
|
|
81
|
+
- [Architecture and asynchronous runtime](docs/ARCHITECTURE.md)
|
|
82
|
+
- [Complete ASCII diagram catalog](docs/DIAGRAMS.md)
|
|
83
|
+
- [Configuration](docs/CONFIGURATION.md)
|
|
84
|
+
- [Packet, step, action, and generator format](docs/PACKET_FORMAT.md)
|
|
85
|
+
- [CLI operations and recovery](docs/OPERATIONS.md)
|
|
86
|
+
- [Security and trust boundaries](docs/SECURITY.md)
|
|
87
|
+
- [Programmatic API and events](docs/PROGRAMMATIC_API.md)
|
|
88
|
+
- [Export and Mattermost/Slack hooks](docs/EXPORT_AND_HOOKS.md)
|
|
89
|
+
- [Bundled packet catalog](docs/BUNDLED_PACKETS.md)
|
|
90
|
+
- [Use cases](docs/USE_CASES.md)
|
|
91
|
+
- [Tests and the PostgreSQL 10-18 matrix](tests/README.md)
|
|
92
|
+
- [Stabilization roadmap](docs/ROADMAP.md)
|
|
93
|
+
|
|
94
|
+
## Features
|
|
95
|
+
|
|
96
|
+
- parallel asynchronous database processing and sequential `--seq` mode;
|
|
97
|
+
- `default`, `read_only`, `no_commit`, `maintenance`, and `export_data`
|
|
98
|
+
packet types;
|
|
99
|
+
- `run_once.sql`, object/schema generators, and maintenance commands;
|
|
100
|
+
- `GEN_OBJ_FLD_N`, `GEN_NSP_FLD_N`, and user-defined `PGC_PL_*` placeholders;
|
|
101
|
+
- SQL steps and synchronous/asynchronous Python steps;
|
|
102
|
+
- persistent `pgc_packets`, `pgc_steps`, `pgc_actions`, and `pgc_locks`;
|
|
103
|
+
- a session advisory lock combined with the durable `pgc_locks` row;
|
|
104
|
+
- bounded retry and reconnection with session-setting and generator recovery;
|
|
105
|
+
- a lock observer for worker-as-blocker and worker-as-waiter cases;
|
|
106
|
+
- typed failures and safe `outcome_unknown` handling;
|
|
107
|
+
- tab-separated output in `.csv` files, ZIP, and AES ZIP;
|
|
108
|
+
- asynchronous Mattermost and Slack hooks;
|
|
109
|
+
- SSL/TLS, CA and hostname verification, CRL, and client certificates;
|
|
110
|
+
- a cancellable UI-neutral API with events and a JSON-safe result;
|
|
111
|
+
- PostgreSQL 10-18 container tests and a separate mTLS test.
|
|
112
|
+
|
|
113
|
+
## Requirements
|
|
114
|
+
|
|
115
|
+
| Component | Supported contract |
|
|
116
|
+
|---|---|
|
|
117
|
+
| Python | 3.10 or newer |
|
|
118
|
+
| PostgreSQL | Major versions 10-18 |
|
|
119
|
+
| Operating system | Linux is the primary CI-tested platform |
|
|
120
|
+
| Runtime dependencies | `asyncpg`, `sqlparse` |
|
|
121
|
+
| AES export | Optional `export` extra (`pyzipper`) |
|
|
122
|
+
| Webhooks | Optional `webhooks` extra (`aiohttp`) |
|
|
123
|
+
| Tests and development | Optional `dev` extra |
|
|
124
|
+
|
|
125
|
+
No PostgreSQL extension is required. The database role must be able to perform
|
|
126
|
+
the target changes, create or use the tracker schema, and inspect its own
|
|
127
|
+
backend sessions. Stopping backends owned by another role may require
|
|
128
|
+
`pg_signal_backend` or superuser; see the [security guide](docs/SECURITY.md).
|
|
129
|
+
|
|
130
|
+
## Installation
|
|
131
|
+
|
|
132
|
+
Install a built release:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
python -m pip install 'pg-converter[export,webhooks]'
|
|
136
|
+
pg-converter --version
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
For development from a source checkout:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
git clone https://github.com/O2eg/pg_converter.git
|
|
143
|
+
cd pg_converter
|
|
144
|
+
|
|
145
|
+
python3 -m venv .venv
|
|
146
|
+
. .venv/bin/activate
|
|
147
|
+
python -m pip install --upgrade pip
|
|
148
|
+
python -m pip install -e '.[dev,export,webhooks]'
|
|
149
|
+
|
|
150
|
+
cp conf/pg_converter.conf.example conf/pg_converter.conf
|
|
151
|
+
pg-converter --version
|
|
152
|
+
pg-converter --help
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Custom `packets/`, `conf/`, `logs/`, and export paths are resolved from the
|
|
156
|
+
current working directory. A custom `$PWD/packets/PACKET_NAME` overrides a
|
|
157
|
+
bundled packet with the same name; otherwise the installed packet is used.
|
|
158
|
+
A relative `--config-file NAME` resolves to `$PWD/conf/NAME`; an absolute path
|
|
159
|
+
is recommended for external configuration.
|
|
160
|
+
|
|
161
|
+
## Minimal configuration
|
|
162
|
+
|
|
163
|
+
```ini
|
|
164
|
+
[databases]
|
|
165
|
+
development = postgresql://user:password@localhost:5432/development
|
|
166
|
+
|
|
167
|
+
[main]
|
|
168
|
+
schema_location = pgc
|
|
169
|
+
db_name_all_confirmation = true
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
The complete parameter list, defaults, precedence, and current limitations are
|
|
173
|
+
documented in [docs/CONFIGURATION.md](docs/CONFIGURATION.md).
|
|
174
|
+
|
|
175
|
+
## Quick start
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# One database.
|
|
179
|
+
pg-converter --packet-name=dba_get_version --db-name=development
|
|
180
|
+
|
|
181
|
+
# Every alias in [databases]; confirmation requires YES when enabled.
|
|
182
|
+
pg-converter --packet-name=dba_get_version --db-name=ALL
|
|
183
|
+
|
|
184
|
+
# Masks and exclusions.
|
|
185
|
+
pg-converter --packet-name=dba_get_version --db-name='prod_*'
|
|
186
|
+
pg-converter --packet-name=dba_get_version \
|
|
187
|
+
--db-name='ALL,exclude:prod_old,dev_*'
|
|
188
|
+
|
|
189
|
+
# Process selected databases sequentially.
|
|
190
|
+
pg-converter --packet-name=test_common --db-name=ALL --seq
|
|
191
|
+
|
|
192
|
+
# Only list selected aliases.
|
|
193
|
+
pg-converter --packet-name=test_common --db-name='prod_*' --list
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Administrative operations:
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
pg-converter --packet-name=test_common --db-name=development --status
|
|
200
|
+
pg-converter --packet-name=test_common --db-name=development --wipe
|
|
201
|
+
pg-converter --packet-name=test_common --db-name=development --unlock
|
|
202
|
+
pg-converter --packet-name=test_common --db-name=development --stop
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
`--status`, `--wipe`, `--unlock`, and `--stop` connect to the database and call
|
|
206
|
+
the non-destructive `init_tables`; if the tracker is absent, its schema and
|
|
207
|
+
tables are created. `--wipe` deletes packet history but does not reverse changes
|
|
208
|
+
to application objects. `--stop` terminates matching backend sessions.
|
|
209
|
+
|
|
210
|
+
The full CLI contract and recovery runbook are in
|
|
211
|
+
[docs/OPERATIONS.md](docs/OPERATIONS.md).
|
|
212
|
+
|
|
213
|
+
## Packet format at a glance
|
|
214
|
+
|
|
215
|
+
```text
|
|
216
|
+
packets/my_packet/
|
|
217
|
+
|-- meta_data.json
|
|
218
|
+
|-- run_once.sql
|
|
219
|
+
|-- 01_step.sql
|
|
220
|
+
|-- 02_gen_nsp.sql
|
|
221
|
+
|-- 02_gen_obj.sql
|
|
222
|
+
|-- 02_step.sql
|
|
223
|
+
|-- 03_step.py
|
|
224
|
+
`-- data/
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Terminology retained from the original project:
|
|
228
|
+
|
|
229
|
+
- **packet**: a directory representing one logical operation;
|
|
230
|
+
- **step**: a root `.sql` or `.py` file;
|
|
231
|
+
- **action**: one concrete transaction or command produced from a step;
|
|
232
|
+
- **generator**: SQL that supplies values for one step;
|
|
233
|
+
- **conversion/deployment**: applying a packet to selected databases.
|
|
234
|
+
|
|
235
|
+
Steps run in lexical order. A generator-backed step creates multiple actions.
|
|
236
|
+
Generator column zero is reserved for a maintenance command; placeholders start
|
|
237
|
+
at index `1`.
|
|
238
|
+
|
|
239
|
+
`run_once.sql` runs before generators are loaded. TEMP and `pg_temp` objects
|
|
240
|
+
work only while the same physical session survives. After a reconnection they
|
|
241
|
+
are gone, so the runtime fails with `SessionLocalRunOnceLost` instead of
|
|
242
|
+
replaying potentially destructive `run_once.sql`.
|
|
243
|
+
|
|
244
|
+
The normative format, checksum behavior, and transactional guarantees are in
|
|
245
|
+
[docs/PACKET_FORMAT.md](docs/PACKET_FORMAT.md).
|
|
246
|
+
|
|
247
|
+
## Tracker and resume behavior
|
|
248
|
+
|
|
249
|
+
The following objects are created in `main.schema_location`:
|
|
250
|
+
|
|
251
|
+
- `pgc_packets`: metadata, packet checksum, and final status;
|
|
252
|
+
- `pgc_steps`: status and latest step error;
|
|
253
|
+
- `pgc_actions`: checksums of successfully applied actions;
|
|
254
|
+
- `pgc_locks`: durable representation of the runtime lock.
|
|
255
|
+
|
|
256
|
+
For a `default` packet, a transactional action and its `pgc_actions` row commit
|
|
257
|
+
atomically. After reconnection, already confirmed action hashes are not run
|
|
258
|
+
again.
|
|
259
|
+
|
|
260
|
+
PG Converter 2.0 does not auto-discover tracker objects created by pre-2.0
|
|
261
|
+
builds. Before reusing an existing migration history, migrate its rows and
|
|
262
|
+
database objects to the documented `pgc_*` names or start with a new tracking
|
|
263
|
+
schema only after reviewing which packet actions have already been applied.
|
|
264
|
+
Never run two tracker namespaces for the same packet concurrently.
|
|
265
|
+
|
|
266
|
+
If a connection is lost while a non-transactional or maintenance action is in
|
|
267
|
+
flight, the server may have applied the command even though the client did not
|
|
268
|
+
receive confirmation. The runtime reports `outcome_unknown`, does not retry it,
|
|
269
|
+
and blocks the next normal run. The operator must inspect the database and
|
|
270
|
+
tracker state; `--force` is appropriate only after that review.
|
|
271
|
+
|
|
272
|
+
## SSL/TLS
|
|
273
|
+
|
|
274
|
+
PostgreSQL URI, `pq://`, and libpq `key=value` formats are supported:
|
|
275
|
+
|
|
276
|
+
```ini
|
|
277
|
+
[databases]
|
|
278
|
+
verified = postgresql://pgc@db.example.com/app?sslmode=verify-full&sslrootcert=/etc/pg_converter/ca.crt
|
|
279
|
+
|
|
280
|
+
mutual_tls = postgresql://pgc@db.example.com/app?sslmode=verify-full&sslrootcert=/etc/pg_converter/ca.crt&sslcert=/etc/pg_converter/client.crt&sslkey=/etc/pg_converter/client.key
|
|
281
|
+
|
|
282
|
+
libpq_style = host=db.example.com port=5432 dbname=app user=pgc sslmode=verify-ca sslrootcert=/etc/pg_converter/ca.crt sslcert=/etc/pg_converter/client.crt sslkey=/etc/pg_converter/client.key
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
Read [docs/SECURITY.md](docs/SECURITY.md) before production use: SQL packets,
|
|
286
|
+
Python packets, placeholders, hooks, logs, and exports are separate trust
|
|
287
|
+
boundaries.
|
|
288
|
+
|
|
289
|
+
## Programmatic API
|
|
290
|
+
|
|
291
|
+
```python
|
|
292
|
+
from pathlib import Path
|
|
293
|
+
|
|
294
|
+
from pg_converter.api import PGConverterService, RunRequest
|
|
295
|
+
|
|
296
|
+
service = PGConverterService(Path("/etc/pg_converter/pg_converter.conf"))
|
|
297
|
+
handle = service.start(
|
|
298
|
+
RunRequest(
|
|
299
|
+
packet_name="test_common",
|
|
300
|
+
db_name="development",
|
|
301
|
+
placeholders={"SCHEMA": "public"},
|
|
302
|
+
),
|
|
303
|
+
event_handler=on_execution_event,
|
|
304
|
+
confirmation_handler=confirm_databases,
|
|
305
|
+
)
|
|
306
|
+
|
|
307
|
+
# If needed:
|
|
308
|
+
# cancellation = await handle.cancel()
|
|
309
|
+
|
|
310
|
+
result = await handle.wait()
|
|
311
|
+
payload = result.to_dict()
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
The API contains no UI components. It exposes `RunRequest`,
|
|
315
|
+
`PGConverterService`, `RunHandle`, `ExecutionEvent`, and `PGCResult`. The
|
|
316
|
+
result is JSON-safe, but it does not yet carry a schema version; integrations
|
|
317
|
+
should pin the `pg-converter` version they use. See
|
|
318
|
+
[docs/PROGRAMMATIC_API.md](docs/PROGRAMMATIC_API.md).
|
|
319
|
+
|
|
320
|
+
## Exit status and results
|
|
321
|
+
|
|
322
|
+
The CLI returns:
|
|
323
|
+
|
|
324
|
+
| Code | Meaning |
|
|
325
|
+
|---:|---|
|
|
326
|
+
| `0` | Every selected database has `success` or `nothing_todo` |
|
|
327
|
+
| `1` | Argument/runtime error, `fail`, `locked`, `terminate`, or cancellation |
|
|
328
|
+
|
|
329
|
+
The programmatic result distinguishes `success`, `fail`, `locked`,
|
|
330
|
+
`nothing_todo`, and `terminate`. Packet status is one of `done`, `started`,
|
|
331
|
+
`exception`, `new`, or `unknown`.
|
|
332
|
+
|
|
333
|
+
## Tests
|
|
334
|
+
|
|
335
|
+
```bash
|
|
336
|
+
# Unit tests.
|
|
337
|
+
pytest -m 'not integration'
|
|
338
|
+
|
|
339
|
+
# One PostgreSQL version.
|
|
340
|
+
PGC_DOCKER_INTEGRATION=1 PGC_DOCKER_VERSIONS=18 \
|
|
341
|
+
pytest --run-integration tests/integration
|
|
342
|
+
|
|
343
|
+
# PostgreSQL 10-18 and TLS/mTLS.
|
|
344
|
+
PGC_DOCKER_INTEGRATION=1 \
|
|
345
|
+
pytest --run-integration tests/integration
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
The complete matrix in GitHub Actions is currently triggered manually with
|
|
349
|
+
`workflow_dispatch`. The unit suite runs on Python 3.10 and 3.12 for pushes and
|
|
350
|
+
pull requests. Test layout and regression-test guidance are in
|
|
351
|
+
[tests/README.md](tests/README.md).
|
|
352
|
+
|
|
353
|
+
## Known export security limitations
|
|
354
|
+
|
|
355
|
+
Files are published atomically through `.part` plus rename, but their
|
|
356
|
+
permissions currently depend on the process `umask`. In addition, the
|
|
357
|
+
`"password": "random"` mode puts the AES ZIP password in the filename and that
|
|
358
|
+
archive path is logged. Do not use `random` for sensitive exports until this is
|
|
359
|
+
fixed; use a controlled password and a protected working directory. See
|
|
360
|
+
[docs/EXPORT_AND_HOOKS.md](docs/EXPORT_AND_HOOKS.md).
|
|
361
|
+
|
|
362
|
+
## Preserved packet and tracker contracts
|
|
363
|
+
|
|
364
|
+
Retained:
|
|
365
|
+
|
|
366
|
+
- the complete original packet set and the `dba_`, `alert_`, `maint_`, `test_`,
|
|
367
|
+
and `YYYYMMDD_TASK_*` naming convention;
|
|
368
|
+
- arbitrary step names and `run_once.sql`;
|
|
369
|
+
- the generator and placeholder model;
|
|
370
|
+
- all five packet types and `meta_data.json`;
|
|
371
|
+
- Mattermost/Slack metadata;
|
|
372
|
+
- MD5 packet and action checksums;
|
|
373
|
+
- the `pgc_*` schema and migration history;
|
|
374
|
+
- list/status/wipe/stop/unlock/template and skip-cancel modes.
|
|
375
|
+
|
|
376
|
+
The packet inventory is complete. The asynchronous Python example and bundled
|
|
377
|
+
hook usernames use the PG Converter 2.0 beta runtime contract.
|
|
378
|
+
|
|
379
|
+
Intentional changes:
|
|
380
|
+
|
|
381
|
+
- threads are replaced by asynchronous tasks;
|
|
382
|
+
- `py-postgresql` is replaced by `asyncpg`;
|
|
383
|
+
- unbounded retry is replaced by a bounded policy;
|
|
384
|
+
- lock ownership is strengthened with an advisory lock;
|
|
385
|
+
- ambiguous non-transactional outcomes are not replayed;
|
|
386
|
+
- SSL/mTLS and a UI-neutral API are added.
|
|
387
|
+
|
|
388
|
+
## License
|
|
389
|
+
|
|
390
|
+
The project is distributed under the MIT License. See [LICENSE](LICENSE).
|