sql/londiste: create deny-trigger on leaf
authorMarko Kreen <markokr@gmail.com>
Wed, 1 Dec 2010 13:19:34 +0000 (15:19 +0200)
committerMarko Kreen <markokr@gmail.com>
Wed, 1 Dec 2010 13:19:34 +0000 (15:19 +0200)
sql/londiste/Makefile
sql/londiste/expected/londiste_leaf.out [new file with mode: 0644]
sql/londiste/functions/londiste.local_add_table.sql
sql/londiste/sql/londiste_leaf.sql [new file with mode: 0644]

index 6d6d0c03ceb70c76babdd0d60d520d8b974e9eaf..0db0bfffe9b6f05660e9339ccd7dbc83424b6382 100644 (file)
@@ -6,7 +6,8 @@ FUNCS = $(shell sed -e 's/^[^\\].*//' -e 's/\\i //' $(SQLS))
 SRCS = $(SQLS) $(FUNCS)
 
 REGRESS = londiste_install londiste_provider londiste_subscriber \
-         londiste_fkeys londiste_execute londiste_seqs londiste_merge
+         londiste_fkeys londiste_execute londiste_seqs londiste_merge \
+         londiste_leaf
 # londiste_denytrigger
 REGRESS_OPTS = --dbname=regression
 
diff --git a/sql/londiste/expected/londiste_leaf.out b/sql/londiste/expected/londiste_leaf.out
new file mode 100644 (file)
index 0000000..8669f64
--- /dev/null
@@ -0,0 +1,118 @@
+set client_min_messages = 'warning';
+\set VERBOSITY 'terse'
+select 1
+from (select set_config(name, 'escape', false) as ignore
+                 from pg_settings where name = 'bytea_output') x
+where x.ignore = 'foo';
+ ?column? 
+----------
+(0 rows)
+
+--
+-- tables
+--
+create table leafdata (
+    id serial primary key,
+    data text
+);
+select current_database();
+ current_database 
+------------------
+ regression
+(1 row)
+
+select * from pgq_node.register_location('leafq', 'lq_node1', 'dbname=db', false);
+ ret_code |      ret_note       
+----------+---------------------
+      200 | Location registered
+(1 row)
+
+select * from pgq_node.register_location('leafq', 'lq_node2', 'dbname=db2', false);
+ ret_code |      ret_note       
+----------+---------------------
+      200 | Location registered
+(1 row)
+
+select * from pgq_node.create_node('leafq', 'leaf', 'lq_node2', 'londiste_leaf', 'lq_node1', 100, null::text);
+ ret_code |                            ret_note                            
+----------+----------------------------------------------------------------
+      200 | Node "lq_node2" initialized for queue "leafq" with type "leaf"
+(1 row)
+
+select * from londiste.local_show_missing('leafq');
+ obj_kind | obj_name 
+----------+----------
+(0 rows)
+
+select * from londiste.local_add_table('leafq', 'public.leafdata');
+ ret_code |                   ret_note                    
+----------+-----------------------------------------------
+      404 | Table not available on queue: public.leafdata
+(1 row)
+
+select * from londiste.global_add_table('leafq', 'public.leafdata');
+ ret_code |           ret_note           
+----------+------------------------------
+      200 | Table added: public.leafdata
+(1 row)
+
+select * from londiste.local_add_table('leafq', 'public.leafdata');
+ ret_code |           ret_note           
+----------+------------------------------
+      200 | Table added: public.leafdata
+(1 row)
+
+select * from londiste.global_add_table('leafq', 'public.tmp');
+ ret_code |        ret_note         
+----------+-------------------------
+      200 | Table added: public.tmp
+(1 row)
+
+select * from londiste.get_table_list('leafq');
+   table_name    | local | merge_state | custom_snapshot | table_attrs | dropped_ddl | copy_role 
+-----------------+-------+-------------+-----------------+-------------+-------------+-----------
+ public.leafdata | t     |             |                 |             |             | 
+ public.tmp      | f     |             |                 |             |             | 
+(2 rows)
+
+select tgname, tgargs from pg_trigger
+where tgrelid = 'public.leafdata'::regclass
+order by 1;
+          tgname          |      tgargs       
+--------------------------+-------------------
+ _londiste_leafq          | leafq\000deny\000
+ _londiste_leafq_truncate | leafq\000deny\000
+(2 rows)
+
+insert into leafdata values (1, 'asd');
+ERROR:  Table 'public.leafdata' to queue 'leafq': change not allowed (I)
+select * from londiste.global_remove_table('leafq', 'public.tmp');
+ ret_code |         ret_note          
+----------+---------------------------
+      200 | Table removed: public.tmp
+(1 row)
+
+select * from londiste.local_remove_table('leafq', 'public.leafdata');
+ ret_code |            ret_note            
+----------+--------------------------------
+      200 | Table removed: public.leafdata
+(1 row)
+
+select * from londiste.local_remove_table('leafq', 'public.leafdata');
+ ret_code |                   ret_note                    
+----------+-----------------------------------------------
+      400 | Table not registered locally: public.leafdata
+(1 row)
+
+select * from londiste.get_table_list('leafq');
+   table_name    | local | merge_state | custom_snapshot | table_attrs | dropped_ddl | copy_role 
+-----------------+-------+-------------+-----------------+-------------+-------------+-----------
+ public.leafdata | f     |             |                 |             |             | 
+(1 row)
+
+select * from londiste.local_show_missing('leafq');
+ obj_kind |    obj_name     
+----------+-----------------
+ r        | public.leafdata
+(1 row)
+
index 162422be7b5d70921eb6b839df9d01a3a8a0d204..156d939da62bed1a2fee144264a50e23e7268422 100644 (file)
@@ -53,8 +53,16 @@ declare
     sql text;
     arg text;
     _node record;
+    _tbloid oid;
+    _trunc_args text;
 begin
+    _trunc_args := '';
     fq_table_name := londiste.make_fqname(i_table_name);
+    _tbloid := londiste.find_table_oid(fq_table_name);
+    if _tbloid is null then
+        select 404, 'Table does not exist: ' || fq_table_name into ret_code, ret_note;
+        return;
+    end if;
     col_types := londiste.find_column_types(fq_table_name);
     if position('k' in col_types) < 1 then
         -- allow missing primary key in case of combined table where
@@ -127,8 +135,16 @@ begin
 
     -- skip triggers on leaf node
     if _node.node_type = 'leaf' then
-        select 200, 'Table added: ' || fq_table_name into ret_code, ret_note;
-        return;
+        -- on weird leafs the trigger funcs may not exist
+        perform 1 from pg_proc p join pg_namespace n on (n.oid = p.pronamespace)
+            where n.nspname = 'pgq' and p.proname in ('logutriga', 'sqltriga');
+        if not found then
+            select 200, 'Table added with no triggers: ' || fq_table_name into ret_code, ret_note;
+            return;
+        end if;
+        -- on regular leaf, install deny trigger
+        i_trg_args := array['deny'];
+        _trunc_args := ', ' || quote_literal('deny');
     end if;
 
     -- create Ins/Upd/Del trigger if it does not exists already
@@ -207,7 +223,7 @@ begin
             sql := 'create trigger ' || quote_ident(trunctrg_name)
                 || ' after truncate on ' || londiste.quote_fqname(fq_table_name)
                 || ' for each statement execute procedure pgq.sqltriga(' || quote_literal(i_queue_name)
-                || ')';
+                || _trunc_args || ')';
             execute sql;
         end if;
     end if;
diff --git a/sql/londiste/sql/londiste_leaf.sql b/sql/londiste/sql/londiste_leaf.sql
new file mode 100644 (file)
index 0000000..23b6a0e
--- /dev/null
@@ -0,0 +1,45 @@
+
+set client_min_messages = 'warning';
+\set VERBOSITY 'terse'
+
+select 1
+from (select set_config(name, 'escape', false) as ignore
+                 from pg_settings where name = 'bytea_output') x
+where x.ignore = 'foo';
+
+
+--
+-- tables
+--
+create table leafdata (
+    id serial primary key,
+    data text
+);
+
+select current_database();
+
+select * from pgq_node.register_location('leafq', 'lq_node1', 'dbname=db', false);
+select * from pgq_node.register_location('leafq', 'lq_node2', 'dbname=db2', false);
+select * from pgq_node.create_node('leafq', 'leaf', 'lq_node2', 'londiste_leaf', 'lq_node1', 100, null::text);
+
+select * from londiste.local_show_missing('leafq');
+
+select * from londiste.local_add_table('leafq', 'public.leafdata');
+select * from londiste.global_add_table('leafq', 'public.leafdata');
+select * from londiste.local_add_table('leafq', 'public.leafdata');
+select * from londiste.global_add_table('leafq', 'public.tmp');
+select * from londiste.get_table_list('leafq');
+
+select tgname, tgargs from pg_trigger
+where tgrelid = 'public.leafdata'::regclass
+order by 1;
+
+insert into leafdata values (1, 'asd');
+
+select * from londiste.global_remove_table('leafq', 'public.tmp');
+select * from londiste.local_remove_table('leafq', 'public.leafdata');
+select * from londiste.local_remove_table('leafq', 'public.leafdata');
+select * from londiste.get_table_list('leafq');
+
+select * from londiste.local_show_missing('leafq');
+