@@ -402,32 +402,27 @@ export class PgIpLock implements AnyLock {
402402 RETURNS TRIGGER LANGUAGE PLPGSQL AS $$
403403 BEGIN PERFORM PG_NOTIFY(OLD.channel, '1'); RETURN OLD; END; $$
404404 ` ) ;
405+
405406 await this . options . pgClient . query ( `
407+ DO $$
406408 BEGIN
409+ BEGIN
410+ DROP TRIGGER IF EXISTS notify_release_lock_trigger
411+ ON ${ PgIpLock . schemaName } .lock;
412+
413+ CREATE CONSTRAINT TRIGGER notify_release_lock_trigger
414+ AFTER DELETE ON ${ PgIpLock . schemaName } .lock
415+ DEFERRABLE INITIALLY DEFERRED
416+ FOR EACH ROW EXECUTE PROCEDURE ${
417+ PgIpLock . schemaName } .notify_lock();
418+
419+ COMMIT;
420+ EXCEPTION
421+ WHEN OTHERS THEN
422+ ROLLBACK;
423+ END;
424+ END $$
407425 ` ) ;
408-
409- try {
410- await this . options . pgClient . query ( `
411- DROP TRIGGER IF EXISTS notify_release_lock_trigger
412- ON ${ PgIpLock . schemaName } .lock
413- ` ) ;
414- // noinspection SqlResolve
415- await this . options . pgClient . query ( `
416- CREATE CONSTRAINT TRIGGER notify_release_lock_trigger
417- AFTER DELETE ON ${ PgIpLock . schemaName } .lock
418- DEFERRABLE INITIALLY DEFERRED
419- FOR EACH ROW EXECUTE PROCEDURE ${
420- PgIpLock . schemaName } .notify_lock()
421- ` ) ;
422- await this . options . pgClient . query ( `
423- COMMIT
424- ` ) ;
425- } catch ( err ) {
426- // istanbul ignore next
427- await this . options . pgClient . query ( `
428- ROLLBACK
429- ` ) ;
430- }
431426 }
432427
433428 /**
@@ -437,35 +432,23 @@ export class PgIpLock implements AnyLock {
437432 */
438433 private async createDeadlockCheck ( ) : Promise < void > {
439434 await this . options . pgClient . query ( `
435+ CREATE OR REPLACE FUNCTION ${ PgIpLock . schemaName } .deadlock_check(
436+ old_app TEXT,
437+ new_app TEXT)
438+ RETURNS TEXT LANGUAGE PLPGSQL AS $$
439+ DECLARE num_apps INTEGER;
440440 BEGIN
441+ SELECT count(query) INTO num_apps
442+ FROM pg_stat_activity
443+ WHERE application_name = old_app;
444+ IF num_apps > 0 THEN
445+ RAISE EXCEPTION 'Duplicate channel for app %', new_app
446+ USING DETAIL = 'LOCKED';
447+ END IF;
448+ RETURN new_app;
449+ END;
450+ $$
441451 ` ) ;
442- try {
443- await this . options . pgClient . query ( `
444- CREATE OR REPLACE FUNCTION ${ PgIpLock . schemaName } .deadlock_check(
445- old_app TEXT,
446- new_app TEXT)
447- RETURNS TEXT LANGUAGE PLPGSQL AS $$
448- DECLARE num_apps INTEGER;
449- BEGIN
450- SELECT count(query) INTO num_apps
451- FROM pg_stat_activity
452- WHERE application_name = old_app;
453- IF num_apps > 0 THEN
454- RAISE EXCEPTION 'Duplicate channel for app %', new_app
455- USING DETAIL = 'LOCKED';
456- END IF;
457- RETURN new_app;
458- END; $$;
459- ` ) ;
460- await this . options . pgClient . query ( `
461- COMMIT
462- ` ) ;
463- } catch ( err ) {
464- // istanbul ignore next
465- await this . options . pgClient . query ( `
466- ROLLBACK
467- ` ) ;
468- }
469452 }
470453}
471454
0 commit comments