All pastes #235106 Raw Edit

Mine

public text v1 · immutable
·published 2006-11-03 00:35 UTC
rendered paste body
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';