Shows how to extend WiredTiger with a more complex custom extractor.
#include <test_util.h>
static const char *home;
struct president_data {
int id;
const char *last_name;
const char *first_name;
uint16_t term_start;
uint16_t term_end;
};
static const struct president_data example_data[] = {{0, "Obama", "Barack", 2009, 2014},
{1, "Bush", "George W", 2001, 2009}, {2, "Clinton", "Bill", 1993, 2001},
{3, "Bush", "George H", 1989, 1993}, {4, "Reagan", "Ronald", 1981, 1989}, {0, NULL, NULL, 0, 0}};
#define YEAR_BASE 1981
#define YEAR_SPAN (2014 - 1981)
static int
{
uint16_t term_end, term_start, year;
char *last_name, *first_name;
(void)extractor;
(void)key;
session, value->
data, value->
size,
"SSHH", &last_name, &first_name, &term_start, &term_end));
for (year = term_start; year <= term_end; ++year) {
fprintf(
stderr, "EXTRACTOR: index op for year %" PRIu16 ": %s %s\n", year, first_name, last_name);
result_cursor->
set_key(result_cursor, year);
error_check(result_cursor->
insert(result_cursor));
}
return (0);
}
static int
{
(void)extractor;
(void)session;
return (0);
}
static void
{
static WT_EXTRACTOR my_extractor = {my_extract, NULL, my_extract_terminate};
error_check(conn->
add_extractor(conn,
"my_extractor", &my_extractor, NULL));
}
static void
{
int i, ret;
char *first_name, *last_name;
uint16_t rec_year, term_end, term_start, year;
year = 0;
srand((unsigned int)getpid());
error_check(session->
open_cursor(session,
"index:presidents:term", NULL, NULL, &cursor));
for (i = 0; i < 10; i++) {
year = (uint16_t)((rand() % YEAR_SPAN) + YEAR_BASE);
printf("Year %" PRIu16 ":\n", year);
error_check(cursor->
search(cursor));
error_check(cursor->
get_key(cursor, &rec_year));
error_check(cursor->
get_value(cursor, &last_name, &first_name, &term_start, &term_end));
ret = 0;
while (term_start <= year && year <= term_end && year == rec_year) {
printf("\t%s %s\n", first_name, last_name);
if ((ret = cursor->
next(cursor)) != 0)
break;
error_check(cursor->
get_key(cursor, &rec_year));
error_check(cursor->
get_value(cursor, &last_name, &first_name, &term_start, &term_end));
}
}
error_check(cursor->
close(cursor));
}
static void
{
struct president_data p;
int i;
error_check(session->
open_cursor(session,
"table:presidents", NULL, NULL, &cursor));
for (i = 0; example_data[i].last_name != NULL && i < 2; i++) {
p = example_data[i];
error_check(cursor->
remove(cursor));
}
}
static void
{
struct president_data p;
int i;
error_check(session->
create(session,
"table:presidents",
"key_format=I,value_format=SSHH,columns=(ID,last_name,first_name,term_begin,term_end)"));
session, "index:presidents:term", "key_format=H,columns=(term),extractor=my_extractor"));
error_check(session->
open_cursor(session,
"table:presidents", NULL, NULL, &cursor));
for (i = 0; example_data[i].last_name != NULL; i++) {
p = example_data[i];
cursor->
set_value(cursor, p.last_name, p.first_name, p.term_start, p.term_end);
fprintf(stderr, "SETUP: table insert %" PRIu16 "-%" PRIu16 ": %s %s\n", p.term_start,
p.term_end, p.first_name, p.last_name);
error_check(cursor->
insert(cursor));
}
}
int
main(int argc, char *argv[])
{
home = example_setup(argc, argv);
add_extractor(conn);
error_check(conn->
open_session(conn, NULL, NULL, &session));
setup_table(session);
read_index(session);
remove_items(session);
error_check(conn->
close(conn, NULL));
return (EXIT_SUCCESS);
}