-- ── module-uo's teardown ────────────────────────────────────────────────── -- -- Destructive, and run ONLY by an explicit admin purge (MODULE_API.md §2.6). -- Nothing on the boot path ever executes this file — uninstalling a module -- leaves its data alone, and removing the data is a separate decision an -- operator has to make on purpose. -- -- It exists because `schema.sql` does. A module that can create tables and -- cannot drop them leaves an operator with orphaned data and no supported way -- to remove it, which is why core refuses to load a module that declares one -- without the other. -- -- **The order is the reverse of creation, and that is load-bearing**: two of -- these tables carry a foreign key into core's `users`, and several reference -- each other. Dropping a parent before its children fails on the constraint, -- and a purge that fails halfway is worse than one that does not run — it -- leaves exactly the orphaned data this file exists to remove. `IF EXISTS` on -- every line so a partially-installed module still tears down cleanly. -- -- What is NOT here, deliberately: rows this module wrote into core's tables. -- `notification_subs` rows for `shard.*` streams and `announce_job_legs` rows -- with leg `towncrier` belong to core's tables, and a module does not delete -- from those — core prunes them when it drops the registrations, which it can -- do because it knows which registrant owned what. The two `settings` rows -- schema.sql seeds (`game_account_signup`, `uo_link_protocol_3_migrated`) are -- the same case with an extra reason: the second is a one-shot MIGRATION -- marker, and deleting it would re-arm a protocol bump against tables this -- file has just dropped. -- The Asset Bridge's three (phase 3). No foreign keys of their own, so they lead: -- `shard_creature_bodies.slug` mirrors an atlas slug and `shard_assets.body` a body -- id, but neither is declared as a constraint — the atlas tables are rebuilt from -- scratch on every refresh, and an FK into a table that is emptied and refilled -- would make an ordinary re-parse fail on rows that are about to be re-inserted. -- -- The uploaded PNGs are NOT removed here. They live under the uploads directory -- alongside the operator's own artwork, this file drops tables rather than files, -- and a purge that deleted an operator's hand-drawn creature portraits because -- they shared a directory with imported ones would be unrecoverable. DROP TABLE IF EXISTS `shard_asset_meta`; DROP TABLE IF EXISTS `shard_creature_bodies`; DROP TABLE IF EXISTS `shard_assets`; DROP TABLE IF EXISTS `shard_atlas_pending`; DROP TABLE IF EXISTS `shard_atlas_meta`; DROP TABLE IF EXISTS `shard_cliloc_meta`; DROP TABLE IF EXISTS `shard_clilocs`; DROP TABLE IF EXISTS `shard_champion_spawns`; DROP TABLE IF EXISTS `shard_landmarks`; DROP TABLE IF EXISTS `shard_regions`; DROP TABLE IF EXISTS `shard_spawn_point_types`; DROP TABLE IF EXISTS `shard_spawn_points`; DROP TABLE IF EXISTS `shard_spawn_creatures`; DROP TABLE IF EXISTS `shard_feature_visibility`; DROP TABLE IF EXISTS `shard_vendor_items`; DROP TABLE IF EXISTS `shard_vendors`; DROP TABLE IF EXISTS `shard_points_boards`; DROP TABLE IF EXISTS `shard_ruleset`; DROP TABLE IF EXISTS `shard_presence`; DROP TABLE IF EXISTS `shard_governor_terms`; DROP TABLE IF EXISTS `shard_governors`; DROP TABLE IF EXISTS `shard_guild_members`; DROP TABLE IF EXISTS `shard_guilds`; DROP TABLE IF EXISTS `shard_pages`; DROP TABLE IF EXISTS `shard_champs`; DROP TABLE IF EXISTS `shard_account_links`; DROP TABLE IF EXISTS `shard_houses`; DROP TABLE IF EXISTS `shard_economy`; DROP TABLE IF EXISTS `shard_online`; DROP TABLE IF EXISTS `shard_events`; DROP TABLE IF EXISTS `uo_link_config`;