@@ -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
0 commit comments