Datum _Slony_I_seqtrack(PG_FUNCTION_ARGS) { static AVLtree seqmem = AVL_INITIALIZER(seqtrack_cmp, seqtrack_free); AVLnode *node; SeqTrack_elem *elem; int32 seqid; int64 seqval; seqid = PG_GETARG_INT32(0); seqval = PG_GETARG_INT64(1); /* * Try to insert the sequence id into the AVL tree. */ if ((node = avl_insert(&seqmem, &seqid)) == NULL) elog(ERROR, "Slony-I: unexpected NULL return from avl_insert()"); if (AVL_DATA(node) == NULL) { /* * This is a new (not seen before) sequence. Create the element, * remember the current lastval and return it to the caller. */ elem = (SeqTrack_elem *) malloc(sizeof(SeqTrack_elem)); elem->seqid = seqid; elem->seqval = seqval; AVL_SETDATA(node, elem); PG_RETURN_INT64(seqval); } /* * This is a sequence seen before. If the value has changed remember and * return it. If it did not, return NULL. */ elem = AVL_DATA(node); if (elem->seqval == seqval) PG_RETURN_NULL(); else elem->seqval = seqval; PG_RETURN_INT64(seqval); }
void avl_dump(avl_tree *tree, avl_node *node, int level) { char space[1024]; memset(space, ' ', 1024); space[level*4] = 0; if (node == NULL) return; avl_dump(tree, node->child[1], level+1); printf("%s[%d]\n", space, ((intr*)AVL_DATA(node, tree))->data); avl_dump(tree, node->child[0], level+1); }