create or replace function pgq.drop_queue(x_queue_name text, x_force bool) returns integer as $$ -- ---------------------------------------------------------------------- -- Function: pgq.drop_queue(2) -- -- Drop queue and all associated tables. -- -- Parameters: -- x_queue_name - queue name -- x_force - ignore (drop) existing consumers -- Returns: -- 1 - success -- Calls: -- pgq.unregister_consumer(queue_name, consumer_name) -- perform pgq.ticker(i_queue_name); -- perform pgq.tune_storage(i_queue_name); -- Tables directly manipulated: -- delete - pgq.queue -- drop - pgq.event_N (), pgq.event_N_0 .. pgq.event_N_M -- ---------------------------------------------------------------------- declare tblname text; q record; num integer; begin -- check if exists select * into q from pgq.queue where queue_name = x_queue_name for update; if not found then raise exception 'No such event queue'; end if; if x_force then perform pgq.unregister_consumer(queue_name, consumer_name) from pgq.get_consumer_info(x_queue_name); else -- check if no consumers select count(*) into num from pgq.subscription where sub_queue = q.queue_id; if num > 0 then raise exception 'cannot drop queue, consumers still attached'; end if; end if; -- drop data tables for i in 0 .. (q.queue_ntables - 1) loop tblname := q.queue_data_pfx || '_' || i::text; execute 'DROP TABLE ' || pgq.quote_fqname(tblname); end loop; execute 'DROP TABLE ' || pgq.quote_fqname(q.queue_data_pfx); -- delete ticks delete from pgq.tick where tick_queue = q.queue_id; -- drop seqs -- FIXME: any checks needed here? execute 'DROP SEQUENCE ' || pgq.quote_fqname(q.queue_tick_seq); execute 'DROP SEQUENCE ' || pgq.quote_fqname(q.queue_event_seq); -- delete event delete from pgq.queue where queue_name = x_queue_name; return 1; end; $$ language plpgsql security definer; create or replace function pgq.drop_queue(x_queue_name text) returns integer as $$ -- ---------------------------------------------------------------------- -- Function: pgq.drop_queue(1) -- -- Drop queue and all associated tables. -- No consumers must be listening on the queue. -- -- ---------------------------------------------------------------------- begin return pgq.drop_queue(x_queue_name, false); end; $$ language plpgsql strict;