diff --git a/.changeset/metal-donkeys-bake.md b/.changeset/metal-donkeys-bake.md new file mode 100644 index 0000000000..00aafb76b1 --- /dev/null +++ b/.changeset/metal-donkeys-bake.md @@ -0,0 +1,5 @@ +--- +"@ensnode/ensdb-sdk": minor +--- + +Added `enable_ext_pg_trgm` migration. diff --git a/.changeset/six-garlics-wish.md b/.changeset/six-garlics-wish.md new file mode 100644 index 0000000000..bdffa32558 --- /dev/null +++ b/.changeset/six-garlics-wish.md @@ -0,0 +1,5 @@ +--- +"@ensnode/ensdb-sdk": minor +--- + +Added `manage_orphaned_ensnode_metadata` migration. diff --git a/packages/ensdb-sdk/migrations/0001_enable_ext_pg_trgm.sql b/packages/ensdb-sdk/migrations/0001_enable_ext_pg_trgm.sql new file mode 100644 index 0000000000..52861e389d --- /dev/null +++ b/packages/ensdb-sdk/migrations/0001_enable_ext_pg_trgm.sql @@ -0,0 +1,3 @@ +-- This migration enables the pg_trgm extension, which is used for +-- trigram-based indexing and searching in PostgreSQL. +CREATE EXTENSION IF NOT EXISTS pg_trgm; diff --git a/packages/ensdb-sdk/migrations/0002_manage_orphaned_ensnode_metadata.sql b/packages/ensdb-sdk/migrations/0002_manage_orphaned_ensnode_metadata.sql new file mode 100644 index 0000000000..392c5aacdc --- /dev/null +++ b/packages/ensdb-sdk/migrations/0002_manage_orphaned_ensnode_metadata.sql @@ -0,0 +1,43 @@ +-- This migration adds an event trigger to handle cleanup of orphaned records +-- in the `ensnode.metadata` table when an ENSIndexer Schema is dropped. +-- Note: Running this migration requires superuser privileges due to +-- the use of event triggers. + +CREATE OR REPLACE FUNCTION "ensnode"."handle_schema_dropped"() +RETURNS event_trigger +AS $$ +DECLARE + obj RECORD; +BEGIN + FOR obj IN + SELECT * + FROM pg_event_trigger_dropped_objects() + LOOP + IF obj.object_type = 'schema' + AND obj.object_name <> 'ensnode' + AND to_regclass('"ensnode"."metadata"') IS NOT NULL THEN + + DELETE FROM "ensnode"."metadata" + WHERE "ens_indexer_schema_name" = obj.object_name; + + END IF; + END LOOP; +END; +$$ LANGUAGE plpgsql; + + +DO $$ +BEGIN + CREATE EVENT TRIGGER cleanup_ensnode_metadata_on_schema_drop + ON sql_drop + WHEN TAG IN ('DROP SCHEMA') + EXECUTE FUNCTION "ensnode"."handle_schema_dropped"(); + +EXCEPTION + WHEN insufficient_privilege THEN + -- Event trigger creation requires superuser privileges. + -- This is expected in managed PostgreSQL environments. + RAISE NOTICE + 'Event trigger "cleanup_ensnode_metadata_on_schema_drop" could not be created due to insufficient privileges. This feature requires superuser access.'; +END; +$$; diff --git a/packages/ensdb-sdk/migrations/meta/0001_snapshot.json b/packages/ensdb-sdk/migrations/meta/0001_snapshot.json new file mode 100644 index 0000000000..335e0426c2 --- /dev/null +++ b/packages/ensdb-sdk/migrations/meta/0001_snapshot.json @@ -0,0 +1,55 @@ +{ + "id": "899ad861-685e-4639-8f31-cf4130b730e6", + "prevId": "d661dcae-f64d-4ecd-a4da-3d5783e17e2c", + "version": "7", + "dialect": "postgresql", + "tables": { + "ensnode.metadata": { + "name": "metadata", + "schema": "ensnode", + "columns": { + "ens_indexer_schema_name": { + "name": "ens_indexer_schema_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "jsonb", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "metadata_pkey": { + "name": "metadata_pkey", + "columns": ["ens_indexer_schema_name", "key"] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "views": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} diff --git a/packages/ensdb-sdk/migrations/meta/0002_snapshot.json b/packages/ensdb-sdk/migrations/meta/0002_snapshot.json new file mode 100644 index 0000000000..df3968a388 --- /dev/null +++ b/packages/ensdb-sdk/migrations/meta/0002_snapshot.json @@ -0,0 +1,55 @@ +{ + "id": "1403ee88-a1d3-4192-a73c-f99b034c97b2", + "prevId": "899ad861-685e-4639-8f31-cf4130b730e6", + "version": "7", + "dialect": "postgresql", + "tables": { + "ensnode.metadata": { + "name": "metadata", + "schema": "ensnode", + "columns": { + "ens_indexer_schema_name": { + "name": "ens_indexer_schema_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "jsonb", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "metadata_pkey": { + "name": "metadata_pkey", + "columns": ["ens_indexer_schema_name", "key"] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "views": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} diff --git a/packages/ensdb-sdk/migrations/meta/_journal.json b/packages/ensdb-sdk/migrations/meta/_journal.json index 46d9e212a3..ed5a9dfa67 100644 --- a/packages/ensdb-sdk/migrations/meta/_journal.json +++ b/packages/ensdb-sdk/migrations/meta/_journal.json @@ -8,6 +8,20 @@ "when": 1773743108514, "tag": "0000_cultured_captain_cross", "breakpoints": true + }, + { + "idx": 1, + "version": "7", + "when": 1775668778695, + "tag": "0001_enable_ext_pg_trgm", + "breakpoints": true + }, + { + "idx": 2, + "version": "7", + "when": 1775668818089, + "tag": "0002_manage_orphaned_ensnode_metadata", + "breakpoints": true } ] }