Skip to content

transactions for lql/migrate #89

@pyramation

Description

@pyramation
it('getClient', async () => {
  try {
    await client.withTransaction(async (client: PoolClient) => {
      const result = await client.query('SELECT 1');
      expect(result.rows[0]['?column?'] || result.rows[0].count).toBe(1);
    });
  } catch (e) {
    if (e instanceof AggregateError) {
      for (const err of e.errors) {
        console.error('AggregateError item:', err);
      }
    } else {
      console.error('Test failure:', e);
    }
    throw e;
  }
});
import { Pool, PoolClient } from 'pg';

export class Database {
  private pool: Pool;

  constructor(databaseUrl: string) {
    this.pool = new Pool({ connectionString: databaseUrl });

    process.on('SIGTERM', async () => {
      await this.shutdown();
    });
  }

  /**
   * Executes a callback function within a database transaction.
   */
  async withTransaction(fn: (client: PoolClient) => Promise<void>): Promise<void> {
    const client = await this.pool.connect();
    try {
      await client.query('BEGIN');
      try {
        await fn(client);
        await client.query('COMMIT');
      } catch (e) {
        console.error('Error during transaction:', e);
        await client.query('ROLLBACK');
        throw e;
      }
    } finally {
      client.release();
    }
  }

  /**
   * Shuts down the connection pool.
   */
  async shutdown(): Promise<void> {
    await this.pool.end();
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions