|
1 | 1 | import type { NodePgDatabase } from "drizzle-orm/node-postgres"; |
2 | | -import { eq } from "drizzle-orm/sql"; |
| 2 | +import { eq, sql } from "drizzle-orm/sql"; |
3 | 3 |
|
4 | 4 | import { ensNodeMetadata } from "@ensnode/ensnode-schema"; |
5 | 5 | import { |
@@ -176,15 +176,25 @@ export class EnsDbClient implements EnsDbClientQuery, EnsDbClientMutation { |
176 | 176 | private async upsertEnsNodeMetadata< |
177 | 177 | EnsNodeMetadataType extends SerializedEnsNodeMetadata = SerializedEnsNodeMetadata, |
178 | 178 | >(metadata: EnsNodeMetadataType): Promise<void> { |
179 | | - await this.db |
180 | | - .insert(ensNodeMetadata) |
181 | | - .values({ |
182 | | - key: metadata.key, |
183 | | - value: metadata.value, |
184 | | - }) |
185 | | - .onConflictDoUpdate({ |
186 | | - target: ensNodeMetadata.key, |
187 | | - set: { value: metadata.value }, |
188 | | - }); |
| 179 | + await this.db.transaction(async (tx) => { |
| 180 | + // Ponder live-query triggers insert into live_query_tables. |
| 181 | + // Because this worker writes outside the Ponder runtime connection pool, |
| 182 | + // the temp table must be ensured to exist on this connection. Without this, |
| 183 | + // the upsert would fail with "relation 'live_query_tables' does not exist" error. |
| 184 | + await tx.execute( |
| 185 | + sql`CREATE TEMP TABLE IF NOT EXISTS live_query_tables (table_name TEXT PRIMARY KEY)`, |
| 186 | + ); |
| 187 | + |
| 188 | + await tx |
| 189 | + .insert(ensNodeMetadata) |
| 190 | + .values({ |
| 191 | + key: metadata.key, |
| 192 | + value: metadata.value, |
| 193 | + }) |
| 194 | + .onConflictDoUpdate({ |
| 195 | + target: ensNodeMetadata.key, |
| 196 | + set: { value: metadata.value }, |
| 197 | + }); |
| 198 | + }); |
189 | 199 | } |
190 | 200 | } |
0 commit comments