Skip to content

Commit 7ff97a2

Browse files
committed
refactoring
1 parent f8a4274 commit 7ff97a2

File tree

2 files changed

+90
-76
lines changed

2 files changed

+90
-76
lines changed

src/PgIpLock.ts

Lines changed: 89 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -311,88 +311,105 @@ export class PgIpLock implements AnyLock {
311311
*/
312312
private async createLock(): Promise<void> {
313313
if (this.uniqueKey) {
314-
await this.options.pgClient.query(`
315-
DO $$
316-
BEGIN
317-
IF NOT EXISTS (
318-
SELECT *
319-
FROM information_schema.columns
320-
WHERE table_schema = '${ PgIpLock.schemaName }'
321-
AND table_name = 'lock'
322-
AND column_name = 'id'
323-
) THEN
324-
DROP TABLE IF EXISTS ${ PgIpLock.schemaName }.lock;
325-
END IF;
326-
END
327-
$$
328-
`);
329-
await this.options.pgClient.query(`
330-
CREATE TABLE IF NOT EXISTS ${ PgIpLock.schemaName }."lock" (
331-
"id" CHARACTER VARYING NOT NULL PRIMARY KEY,
332-
"channel" CHARACTER VARYING NOT NULL,
333-
"app" CHARACTER VARYING NOT NULL
334-
)
335-
`);
336-
} else {
337-
await this.options.pgClient.query(`
338-
DO $$
339-
BEGIN
340-
IF EXISTS (
341-
SELECT *
342-
FROM information_schema.columns
343-
WHERE table_schema = '${ PgIpLock.schemaName }'
344-
AND table_name = 'lock'
345-
AND column_name = 'id'
346-
) THEN
347-
DROP TABLE IF EXISTS ${ PgIpLock.schemaName }.lock;
348-
END IF;
349-
END
350-
$$
351-
`);
352-
await this.options.pgClient.query(`
353-
CREATE TABLE IF NOT EXISTS ${ PgIpLock.schemaName }."lock" (
354-
"channel" CHARACTER VARYING NOT NULL PRIMARY KEY,
355-
"app" CHARACTER VARYING NOT NULL
356-
)
357-
`);
314+
await this.createUniqueLock();
315+
316+
return ;
358317
}
359318

360-
if (this.uniqueKey) {
319+
await this.createChannelLock();
320+
}
321+
322+
/**
323+
* Creates unique locks by IDs in the database
324+
*
325+
* @return {Promise<void>}
326+
*/
327+
private async createUniqueLock(): Promise<void> {
328+
await this.options.pgClient.query(`
329+
DO $$
330+
BEGIN
331+
IF NOT EXISTS (
332+
SELECT *
333+
FROM information_schema.columns
334+
WHERE table_schema = '${ PgIpLock.schemaName }'
335+
AND table_name = 'lock'
336+
AND column_name = 'id'
337+
) THEN
338+
DROP TABLE IF EXISTS ${ PgIpLock.schemaName }.lock;
339+
END IF;
340+
END
341+
$$
342+
`);
343+
await this.options.pgClient.query(`
344+
CREATE TABLE IF NOT EXISTS ${ PgIpLock.schemaName }."lock" (
345+
"id" CHARACTER VARYING NOT NULL PRIMARY KEY,
346+
"channel" CHARACTER VARYING NOT NULL,
347+
"app" CHARACTER VARYING NOT NULL
348+
)
349+
`);
350+
await this.options.pgClient.query(`
351+
DROP TRIGGER IF EXISTS notify_release_lock_trigger
352+
ON ${PgIpLock.schemaName}.lock
353+
`);
354+
}
355+
356+
/**
357+
* Creates locks by channel names in the database
358+
*
359+
* @return {Promise<void>}
360+
*/
361+
private async createChannelLock(): Promise<void> {
362+
await this.options.pgClient.query(`
363+
DO $$
364+
BEGIN
365+
IF EXISTS (
366+
SELECT *
367+
FROM information_schema.columns
368+
WHERE table_schema = '${ PgIpLock.schemaName }'
369+
AND table_name = 'lock'
370+
AND column_name = 'id'
371+
) THEN
372+
DROP TABLE IF EXISTS ${ PgIpLock.schemaName }.lock;
373+
END IF;
374+
END
375+
$$
376+
`);
377+
await this.options.pgClient.query(`
378+
CREATE TABLE IF NOT EXISTS ${ PgIpLock.schemaName }."lock" (
379+
"channel" CHARACTER VARYING NOT NULL PRIMARY KEY,
380+
"app" CHARACTER VARYING NOT NULL
381+
)
382+
`);
383+
// noinspection SqlResolve
384+
await this.options.pgClient.query(`
385+
CREATE OR REPLACE FUNCTION ${PgIpLock.schemaName}.notify_lock()
386+
RETURNS TRIGGER LANGUAGE PLPGSQL AS $$
387+
BEGIN PERFORM PG_NOTIFY(OLD.channel, '1'); RETURN OLD; END; $$
388+
`);
389+
await this.options.pgClient.query(`
390+
BEGIN
391+
`);
392+
393+
try {
361394
await this.options.pgClient.query(`
362395
DROP TRIGGER IF EXISTS notify_release_lock_trigger
363-
ON ${PgIpLock.schemaName}.lock
396+
ON ${ PgIpLock.schemaName }.lock
364397
`);
365-
} else {
366398
// noinspection SqlResolve
367399
await this.options.pgClient.query(`
368-
CREATE OR REPLACE FUNCTION ${PgIpLock.schemaName}.notify_lock()
369-
RETURNS TRIGGER LANGUAGE PLPGSQL AS $$
370-
BEGIN PERFORM PG_NOTIFY(OLD.channel, '1'); RETURN OLD; END; $$
400+
CREATE CONSTRAINT TRIGGER notify_release_lock_trigger
401+
AFTER DELETE ON ${PgIpLock.schemaName}.lock
402+
DEFERRABLE INITIALLY DEFERRED
403+
FOR EACH ROW EXECUTE PROCEDURE ${
404+
PgIpLock.schemaName}.notify_lock()
371405
`);
372406
await this.options.pgClient.query(`
373-
BEGIN
407+
COMMIT
408+
`);
409+
} catch (err) {
410+
await this.options.pgClient.query(`
411+
ROLLBACK
374412
`);
375-
try {
376-
await this.options.pgClient.query(`
377-
DROP TRIGGER IF EXISTS notify_release_lock_trigger
378-
ON ${ PgIpLock.schemaName }.lock
379-
`);
380-
// noinspection SqlResolve
381-
await this.options.pgClient.query(`
382-
CREATE CONSTRAINT TRIGGER notify_release_lock_trigger
383-
AFTER DELETE ON ${PgIpLock.schemaName}.lock
384-
DEFERRABLE INITIALLY DEFERRED
385-
FOR EACH ROW EXECUTE PROCEDURE ${
386-
PgIpLock.schemaName}.notify_lock()
387-
`);
388-
await this.options.pgClient.query(`
389-
COMMIT
390-
`);
391-
} catch (err) {
392-
await this.options.pgClient.query(`
393-
ROLLBACK
394-
`);
395-
}
396413
}
397414
}
398415

src/PgPubSub.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -694,10 +694,7 @@ export class PgPubSub extends EventEmitter {
694694
}, uniqueKey);
695695

696696
await lock.init();
697-
698-
if (!uniqueKey) {
699-
lock.onRelease(chan => this.listen(chan));
700-
}
697+
!uniqueKey && lock.onRelease(chan => this.listen(chan));
701698

702699
return lock;
703700
}

0 commit comments

Comments
 (0)