From 988f513655c7312890805a140494d0967cdca30b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sat, 28 Mar 2026 14:32:04 -0400 Subject: [PATCH] fix: try upsert type if it fails --- src/database/postgres/helpers.js | 36 ++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/src/database/postgres/helpers.js b/src/database/postgres/helpers.js index 8b92d3fe50..35c41012de 100644 --- a/src/database/postgres/helpers.js +++ b/src/database/postgres/helpers.js @@ -27,14 +27,14 @@ DELETE FROM "legacy_object" AND "expireAt" <= CURRENT_TIMESTAMP`, }); - const res = await db.query({ + const res = await tryUpsert(db, { name: 'ensureLegacyObjectType_upsert', text: ` -INSERT INTO "legacy_object" ("_key", "type") -VALUES ($1::TEXT, $2::TEXT::LEGACY_OBJECT_TYPE) - ON CONFLICT ("_key") - DO UPDATE SET "type" = "legacy_object"."type" - RETURNING "type"`, + INSERT INTO "legacy_object" ("_key", "type") + VALUES ($1::TEXT, $2::TEXT::LEGACY_OBJECT_TYPE) + ON CONFLICT ("_key") + DO UPDATE SET "type" = "legacy_object"."type" + RETURNING "type"`, values: [key, type], }); @@ -54,15 +54,15 @@ DELETE FROM "legacy_object" AND "expireAt" <= CURRENT_TIMESTAMP`, }); - const res = await db.query({ + const res = await tryUpsert(db, { name: 'ensureLegacyObjectsType_upsert', text: ` INSERT INTO "legacy_object" ("_key", "type") SELECT k, $2::TEXT::LEGACY_OBJECT_TYPE - FROM UNNEST($1::TEXT[]) k - ON CONFLICT ("_key") - DO UPDATE SET "type" = "legacy_object"."type" - RETURNING "_key", "type"`, +FROM UNNEST($1::TEXT[]) k + ON CONFLICT ("_key") + DO UPDATE SET "type" = "legacy_object"."type" + RETURNING "_key", "type"`, values: [keys, type], }); @@ -74,4 +74,18 @@ SELECT k, $2::TEXT::LEGACY_OBJECT_TYPE } }; +async function tryUpsert(db, queryConfig) { + let res; + try { + res = await db.query(queryConfig); + } catch (err) { + if (err.code === '23505') { // retry if failed due to error: unique constraint + res = await db.query(queryConfig); + } else { + throw err; + } + } + return res; +} + helpers.noop = function () {};