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';