def cmd_resync(self, *args):
"""Reload data from provider node.."""
- # fixme
- q = "select * from londiste.node_resync_table(%s, %s)"
db = self.get_database('db')
+ q = "select * from londiste.local_set_table_state(%s, %s, null, null)"
self.exec_cmd_many(db, q, [self.set_name], args)
def cmd_tables(self):
def cmd_missing(self):
"""Show missing tables on local node."""
- # fixme
- q = "select * from londiste.node_show_missing(%s)"
+ q = "select * from londiste.local_show_missing(%s)"
db = self.get_database('db')
self.display_table(db, "Missing objects on node", q, [self.set_name])
-- toggle sync
select * from londiste.local_set_table_state('branch_set', 'public.ref_1', null, 'ok');
- local_set_table_state
------------------------
- 1
+ ret_code | ret_note
+----------+--------------------------------------
+ 200 | Table public.ref_1 state set to 'ok'
(1 row)
select * from londiste.get_valid_pending_fkeys('branch_set');
(0 rows)
select * from londiste.local_set_table_state('branch_set', 'public.ref_2', null, 'ok');
- local_set_table_state
------------------------
- 1
+ ret_code | ret_note
+----------+--------------------------------------
+ 200 | Table public.ref_2 state set to 'ok'
(1 row)
select * from londiste.get_valid_pending_fkeys('branch_set');
(1 row)
select * from londiste.local_set_table_state('branch_set', 'public.ref_3', null, 'ok');
- local_set_table_state
------------------------
- 1
+ ret_code | ret_note
+----------+--------------------------------------
+ 200 | Table public.ref_3 state set to 'ok'
(1 row)
select * from londiste.get_valid_pending_fkeys('branch_set');
(1 row)
select * from londiste.local_set_table_state('part1_set', 'public.tblmerge', null, 'in-copy');
- local_set_table_state
------------------------
- 1
+ ret_code | ret_note
+----------+----------------------------------------------
+ 200 | Table public.tblmerge state set to 'in-copy'
(1 row)
select * from londiste.local_set_table_state('part2_set', 'public.tblmerge', null, 'in-copy');
- local_set_table_state
------------------------
- 1
+ ret_code | ret_note
+----------+----------------------------------------------
+ 200 | Table public.tblmerge state set to 'in-copy'
(1 row)
select * from londiste.get_table_list('part1_set');
(1 row)
select * from londiste.local_set_table_state('part1_set', 'public.tblmerge', null, 'in-copy');
- local_set_table_state
------------------------
- 1
+ ret_code | ret_note
+----------+----------------------------------------------
+ 200 | Table public.tblmerge state set to 'in-copy'
(1 row)
select * from londiste.local_set_table_state('part2_set', 'public.tblmerge', null, 'catching-up');
- local_set_table_state
------------------------
- 1
+ ret_code | ret_note
+----------+--------------------------------------------------
+ 200 | Table public.tblmerge state set to 'catching-up'
(1 row)
select * from londiste.get_table_list('part1_set');
(1 row)
select * from londiste.local_set_table_state('part1_set', 'public.tblmerge', null, 'catching-up');
- local_set_table_state
------------------------
- 1
+ ret_code | ret_note
+----------+--------------------------------------------------
+ 200 | Table public.tblmerge state set to 'catching-up'
(1 row)
select * from londiste.local_set_table_state('part2_set', 'public.tblmerge', null, 'catching-up');
- local_set_table_state
------------------------
- 1
+ ret_code | ret_note
+----------+--------------------------------------------------
+ 200 | Table public.tblmerge state set to 'catching-up'
(1 row)
select * from londiste.get_table_list('part1_set');
create or replace function londiste.local_set_table_state(
- i_queue_name text,
- i_table_name text,
- i_snapshot text,
- i_merge_state text)
-returns integer as $$
+ in i_queue_name text,
+ in i_table_name text,
+ in i_snapshot text,
+ in i_merge_state text,
+ out ret_code int4,
+ out ret_note text)
+as $$
-- ----------------------------------------------------------------------
-- Function: londiste.local_set_table_state(4)
--
-- i_table - table name
-- i_snapshot - optional remote snapshot info
-- i_merge_state - merge state
---
--- Returns:
--- nothing
-- ----------------------------------------------------------------------
+declare
+ _tbl text;
begin
+ _tbl = londiste.make_fqname(i_table_name);
+
update londiste.table_info
set custom_snapshot = i_snapshot,
merge_state = i_merge_state,
else skip_truncate
end
where queue_name = i_queue_name
- and table_name = i_table_name
+ and table_name = _tbl
and local;
if not found then
- raise exception 'no such table';
+ select 404, 'No such table: ' || _tbl
+ into ret_code, ret_note;
+ return;
end if;
- return 1;
+ select 200, 'Table ' || _tbl || ' state set to '
+ || coalesce(quote_literal(i_merge_state), 'NULL')
+ into ret_code, ret_note;
+ return;
end;
$$ language plpgsql;
--- /dev/null
+
+create or replace function londiste.local_show_missing(
+ in i_queue_name text,
+ out obj_kind text, out obj_name text)
+returns setof record as $$
+-- ----------------------------------------------------------------------
+-- Function: londiste.local_show_missing(1)
+--
+-- Return info about missing tables. On root show tables
+-- not registered on set, on branch/leaf show tables
+-- in set but not registered locally.
+-- ----------------------------------------------------------------------
+begin
+ if pgq_node.is_root_node(i_queue_name) then
+ for obj_kind, obj_name in
+ select r.relkind, n.nspname || '.' || r.relname
+ from pg_catalog.pg_class r, pg_catalog.pg_namespace n
+ where n.oid = r.relnamespace
+ and r.relkind in ('r', 'S')
+ and n.nspname not in ('pgq', 'pgq_ext', 'pgq_node', 'londiste', 'pg_catalog', 'information_schema')
+ and n.nspname !~ '^pg_(toast|temp)'
+ and not exists (select 1 from londiste.table_info
+ where queue_name = i_queue_name
+ and table_name = (n.nspname || '.' || r.relname))
+ order by 1, 2
+ loop
+ return next;
+ end loop;
+ else
+ for obj_kind, obj_name in
+ select 'S', s.seq_name from londiste.seq_info s
+ where s.queue_name = i_queue_name
+ and not s.local
+ union all
+ select 'r', t.table_name from londiste.table_info t
+ where t.queue_name = i_queue_name
+ and not t.local
+ order by 1, 2
+ loop
+ return next;
+ end loop;
+ end if;
+ return;
+end;
+$$ language plpgsql strict stable;
+
select * from londiste.local_add_table('aset', 'public.testdata');
insert into testdata (data) values ('test-data');
select * from londiste.get_table_list('aset');
+select * from londiste.local_show_missing('aset');
select * from londiste.local_remove_table('aset', 'public.testdata');
select * from londiste.local_remove_table('aset', 'public.testdata');
select * from londiste.get_table_list('aset');
select ev_id, ev_type, ev_data, ev_extra1 from pgq.event_template;
+select * from londiste.local_show_missing('aset');
+
select * from pgq_node.register_location('branch_set', 'pnode', 'dbname=db2', false);
select * from pgq_node.create_node('branch_set', 'branch', 'snode', 'londiste_branch', 'pnode', 100, null::text);
+select * from londiste.local_show_missing('branch_set');
+
select * from londiste.local_add_table('branch_set', 'public.slavedata');
select * from londiste.global_add_table('branch_set', 'public.slavedata');
select * from londiste.local_add_table('branch_set', 'public.slavedata');
select * from londiste.local_remove_table('branch_set', 'public.slavedata');
select * from londiste.get_table_list('branch_set');
+select * from londiste.local_show_missing('branch_set');
+
-- Group: Information
\i functions/londiste.get_seq_list.sql
\i functions/londiste.get_table_list.sql
+\i functions/londiste.local_show_missing.sql
-- Group: Local object registration (setup tool)
\i functions/londiste.local_add_seq.sql