/* * Copyright (c) 2010-2012 Postgres-XC Development Group */ #include #include #include "gtm/libpq-fe.h" #include "gtm/gtm_c.h" #include "gtm/gtm_client.h" #include "gtm/register.h" #include "test_common.h" pthread_key_t threadinfo_key; void setUp() { int i; connect1(); /* delete old stuffs */ for (i=0 ; i<10 ; i++) { GTM_SequenceKeyData seqkey; char key[16]; snprintf(key, sizeof(key), "seq%d", i); seqkey.gsk_key = key; seqkey.gsk_keylen = strlen(seqkey.gsk_key); seqkey.gsk_type = GTM_SEQ_FULL_NAME; close_sequence(conn, &seqkey); } /* Create the first one. */ { GTM_SequenceKeyData seqkey; GTM_Sequence increment; GTM_Sequence minval; GTM_Sequence maxval; GTM_Sequence startval; bool cycle; int rc; /* create a key */ seqkey.gsk_key = strdup("seq1"); seqkey.gsk_keylen = strlen(seqkey.gsk_key); seqkey.gsk_type = GTM_SEQ_FULL_NAME; increment = 1; minval = 0; maxval = 10000; startval = 0; cycle = true; rc = open_sequence(conn, &seqkey, increment, minval, maxval, startval, cycle); _ASSERT( rc>=0 ); } } void tearDown() { GTMPQfinish(conn); } void test_seq_01() { int rc; GTM_SequenceKeyData seqkey; GTM_Sequence increment; GTM_Sequence minval; GTM_Sequence maxval; GTM_Sequence startval; bool cycle; SETUP(); /* create a key */ seqkey.gsk_key = strdup("seq2"); seqkey.gsk_keylen = strlen(seqkey.gsk_key); seqkey.gsk_type = GTM_SEQ_FULL_NAME; increment = 1; minval = 0; maxval = 10000; startval = 0; cycle = true; rc = open_sequence(conn, &seqkey, increment, minval, maxval, startval, cycle); _ASSERT( rc>=0 ); TEARDOWN(); } void test_seq_02() { int rc; GTM_SequenceKeyData seqkey; SETUP(); /* create a key */ seqkey.gsk_key = strdup("seq1"); seqkey.gsk_keylen = strlen(seqkey.gsk_key); seqkey.gsk_type = GTM_SEQ_FULL_NAME; rc = close_sequence(conn, &seqkey); _ASSERT( rc>=0 ); TEARDOWN(); } void test_seq_03() { GTM_SequenceKeyData seqkey; GTM_Sequence cur; SETUP(); /* create a key */ seqkey.gsk_key = strdup("seq1"); seqkey.gsk_keylen = strlen(seqkey.gsk_key); seqkey.gsk_type = GTM_SEQ_FULL_NAME; cur = get_current(conn, &seqkey); _ASSERT( cur==0 ); TEARDOWN(); } void test_seq_04() { int rc; GTM_SequenceKeyData seqkey; GTM_Sequence increment; GTM_Sequence minval; GTM_Sequence maxval; GTM_Sequence startval; bool cycle; GTM_Sequence cur; SETUP(); /* create a key */ seqkey.gsk_key = strdup("seq1"); seqkey.gsk_keylen = strlen(seqkey.gsk_key); seqkey.gsk_type = GTM_SEQ_FULL_NAME; cur = get_next(conn, &seqkey); _ASSERT( cur==0 ); cur = get_next(conn, &seqkey); _ASSERT( cur==1 ); cur = get_next(conn, &seqkey); _ASSERT( cur==2 ); TEARDOWN(); } void test_seq_05() { int rc; GTM_SequenceKeyData seqkey; GTM_Sequence cur; SETUP(); /* create a key */ seqkey.gsk_key = strdup("seq1"); seqkey.gsk_keylen = strlen(seqkey.gsk_key); seqkey.gsk_type = GTM_SEQ_FULL_NAME; rc = set_val(conn, &seqkey, 1000, true); _ASSERT( rc>=0 ); cur = get_next(conn, &seqkey); _ASSERT( cur==1001 ); cur = get_next(conn, &seqkey); _ASSERT( cur==1002 ); /* * FIXME: When `iscalled' is false, set_val() does not affect the sequence value. */ rc = set_val(conn, &seqkey, 1000, false); _ASSERT( rc>=0 ); cur = get_next(conn, &seqkey); _ASSERT( cur==0 ); /* FIXME: */ cur = get_next(conn, &seqkey); _ASSERT( cur==1 ); /* FIXME: */ TEARDOWN(); } void test_seq_06() { int rc; GTM_SequenceKeyData seqkey; int i; GTM_Sequence cur; SETUP(); /* create a key */ seqkey.gsk_key = strdup("seq1"); seqkey.gsk_keylen = strlen(seqkey.gsk_key); seqkey.gsk_type = GTM_SEQ_FULL_NAME; for (i=0 ; i<1000 ; i++) { cur = get_next(conn, &seqkey); _ASSERT( cur==i ); } /* get_next() x 1000 done. */ rc = reset_sequence(conn, &seqkey); _ASSERT( rc>=0 ); cur = get_next(conn, &seqkey); _ASSERT( cur==1 ); TEARDOWN(); } void test_seq_07() { int rc; GTM_SequenceKeyData seqkey; GTM_SequenceKeyData newseqkey; int i; GTM_Sequence cur; SETUP(); /* create a key */ seqkey.gsk_key = strdup("seq1"); seqkey.gsk_keylen = strlen(seqkey.gsk_key); seqkey.gsk_type = GTM_SEQ_FULL_NAME; /* create a key */ newseqkey.gsk_key = strdup("seqnew"); newseqkey.gsk_keylen = strlen(newseqkey.gsk_key); newseqkey.gsk_type = GTM_SEQ_FULL_NAME; rc = rename_sequence(conn, &seqkey, &newseqkey); _ASSERT( rc>=0 ); cur = get_next(conn, &newseqkey); _ASSERT( cur==0 ); cur = get_next(conn, &newseqkey); _ASSERT( cur==1 ); rc = close_sequence(conn, &newseqkey); _ASSERT( rc>=0 ); TEARDOWN(); } void test_seq_08() { int rc; GTM_SequenceKeyData seqkey; GTM_SequenceKeyData newseqkey; int i; GTM_Sequence cur; SETUP(); /* create a key */ seqkey.gsk_key = strdup("seq1"); seqkey.gsk_keylen = strlen(seqkey.gsk_key); seqkey.gsk_type = GTM_SEQ_FULL_NAME; cur = get_next(conn, &seqkey); _ASSERT( cur==0 ); { GTM_Sequence increment; GTM_Sequence minval; GTM_Sequence maxval; GTM_Sequence startval; bool cycle; increment = 1; minval = 100; maxval = 10000; startval = 100; cycle = true; rc = alter_sequence(conn, &seqkey, increment, minval, maxval, startval, 256, /* lastval */ cycle, true); _ASSERT( rc>=0 ); } cur = get_current(conn, &seqkey); _ASSERT( cur==100 ); cur = get_next(conn, &seqkey); _ASSERT( cur==101 ); TEARDOWN(); } void test_seq_09() { GlobalTransactionId next_gxid; GTM_SequenceKeyData key1; GTM_SequenceKeyData key2; GTM_SequenceKeyData key3; int rc, i; GTM_SeqInfo *seq_list[1024]; SETUP(); key1.gsk_keylen = strlen("seq1"); key1.gsk_key = strdup("seq1"); key1.gsk_type = GTM_SEQ_FULL_NAME; key2.gsk_keylen = strlen("seq2"); key2.gsk_key = strdup("seq2"); key3.gsk_type = GTM_SEQ_FULL_NAME; key3.gsk_keylen = strlen("seq3"); key3.gsk_key = strdup("seq3"); key3.gsk_type = GTM_SEQ_FULL_NAME; /* name, increment, min, max, start, cycle */ rc = open_sequence(conn, &key2, 1, 1, 10000, 5, true); _ASSERT( rc==0 ); rc = open_sequence(conn, &key3, 1, 1, 10000, 7, true); _ASSERT( rc==0 ); memset(seq_list, 0, sizeof(GTM_SeqInfo *) * 1024); rc = get_sequence_list(conn, seq_list, 1024); _ASSERT( rc==3 ); _ASSERT( strncmp(seq_list[0]->gs_key->gsk_key, key1.gsk_key, 4)==0 ); _ASSERT( strncmp(seq_list[1]->gs_key->gsk_key, key2.gsk_key, 4)==0 ); _ASSERT( strncmp(seq_list[2]->gs_key->gsk_key, key3.gsk_key, 4)==0 ); { GTM_Sequence cur; cur = get_next(conn, seq_list[0]->gs_key); fprintf(stderr, "key=%s, cur=%d\n", seq_list[0]->gs_key->gsk_key, cur); _ASSERT( cur==0 ); cur = get_next(conn, seq_list[1]->gs_key); fprintf(stderr, "key=%s, cur=%d\n", seq_list[1]->gs_key->gsk_key, cur); _ASSERT( cur==5 ); cur = get_next(conn, seq_list[2]->gs_key); fprintf(stderr, "key=%s, cur=%d\n", seq_list[2]->gs_key->gsk_key, cur); _ASSERT( cur==7 ); } TEARDOWN(); } int main(int argc, char *argv[]) { test_seq_01(); test_seq_02(); test_seq_03(); test_seq_04(); test_seq_05(); /* set_val */ test_seq_06(); /* reset_sequence */ test_seq_07(); /* rename_sequence */ test_seq_08(); /* alter_sequence */ test_seq_09(); /* get_sequence_list */ return 0; }