CREATE SEQUENCE posts_seq; CREATE TABLE posts ( id int4 PRIMARY KEY DEFAULT NEXTVAL('posts_seq'), parent_id int4, lft int4, rgt int4, subject varchar, post_date timestamp DEFAULT CURRENT_TIMESTAMP ); CREATE LANGUAGE 'plperl'; CREATE OR REPLACE FUNCTION add_post( int4, varchar ) RETURNS VOID AS $$ my ($parent_id, $subject) = @_; # Get the parents right value my $parent = "SELECT * FROM posts WHERE id = $parent_id"; my $parent_rv = spi_exec_query($parent); my $parent_right = $parent_rv->{rows}[0]->{rgt}; my $new_left = $parent_right; my $new_right = $parent_right + 1; # Update all of our existing posts my $update_lefts = "UPDATE posts SET lft = lft + 2 WHERE lft > $parent_right"; my $update_rights = "UPDATE posts SET rgt = rgt + 2 WHERE rgt >= $parent_right"; spi_exec_query( $update_rights ); spi_exec_query( $update_lefts ); # Now insert the new post my $insert = "INSERT INTO posts (parent_id, lft, rgt, subject) VALUES ". "( $parent_id, $new_left, $new_right, '$subject')"; spi_exec_query( $insert ); $$ LANGUAGE 'plperl';