env3.cpp
Same as env2.c, but written in C++
#include <iostream>
#include <stdlib.h>
#include <ham/hamsterdb.hpp>
#define MAX_DBS 3
#define DBNAME_CUSTOMER 1
#define DBNAME_ORDER 2
#define DBNAME_C2O 3
#define DBIDX_CUSTOMER 0
#define DBIDX_ORDER 1
#define DBIDX_C2O 2
#define MAX_CUSTOMERS 4
#define MAX_ORDERS 8
typedef struct
{
int id;
char name[32];
} customer_t;
typedef struct
{
int id;
int customer_id;
char assignee[32];
} order_t;
int
run_demo(void)
{
int i;
ham::env env;
ham::db db[MAX_DBS];
ham::cursor cursor[MAX_DBS];
ham::key key, cust_key, ord_key, c2o_key;
ham::record record, cust_record, ord_record, c2o_record;
customer_t customers[MAX_CUSTOMERS]={
{ 1, "Alan Antonov Corp." },
{ 2, "Barry Broke Inc." },
{ 3, "Carl Caesar Lat." },
{ 4, "Doris Dove Brd." }
};
order_t orders[MAX_ORDERS]={
{ 1, 1, "Joe" },
{ 2, 1, "Tom" },
{ 3, 3, "Joe" },
{ 4, 4, "Tom" },
{ 5, 3, "Ben" },
{ 6, 3, "Ben" },
{ 7, 4, "Chris" },
{ 8, 1, "Ben" }
};
env.create("test.db");
db[DBIDX_CUSTOMER]=env.create_db(DBNAME_CUSTOMER);
db[DBIDX_ORDER] =env.create_db(DBNAME_ORDER);
db[DBIDX_C2O] =env.create_db(DBNAME_C2O, HAM_ENABLE_DUPLICATES);
for (i=0; i<MAX_DBS; i++) {
cursor[i].create(&db[i]);
}
for (i=0; i<MAX_CUSTOMERS; i++) {
key.set_size(sizeof(int));
key.set_data(&customers[i].id);
record.set_size(sizeof(customer_t));
record.set_data(&customers[i]);
db[0].insert(&key, &record);
}
for (i=0; i<MAX_ORDERS; i++) {
key.set_size(sizeof(int));
key.set_data(&orders[i].id);
record.set_size(sizeof(orders[i].assignee));
record.set_data(orders[i].assignee);
db[1].insert(&key, &record);
}
for (i=0; i<MAX_ORDERS; i++) {
key.set_size(sizeof(int));
key.set_data(&orders[i].customer_id);
record.set_size(sizeof(int));
record.set_data(&orders[i].id);
db[2].insert(&key, &record, HAM_DUPLICATE);
}
while (1) {
customer_t *customer;
try {
cursor[0].move_next(&cust_key, &cust_record);
}
catch (ham::error &e) {
if (e.get_errno()==HAM_KEY_NOT_FOUND)
break;
else {
std::cerr << "cursor.move_next() failed: " << e.get_string()
<< std::endl;
return (-1);
}
}
customer=(customer_t *)cust_record.get_data();
std::cout << "customer " << customer->id << " ('"
<< customer->name << "')" << std::endl;
c2o_key.set_data(&customer->id);
c2o_key.set_size(sizeof(int));
try {
cursor[2].find(&c2o_key);
}
catch (ham::error &e) {
if (e.get_errno()==HAM_KEY_NOT_FOUND)
continue;
else {
std::cerr << "cursor.find() failed: " << e.get_string()
<< std::endl;
return (-1);
}
}
cursor[2].move(0, &c2o_record);
do {
int order_id;
order_id=*(int *)c2o_record.get_data();
ord_key.set_data(&order_id);
ord_key.set_size(sizeof(int));
ord_record=db[1].find(&ord_key);
std::cout << " order: " << order_id << " (assigned to "
<< (char *)ord_record.get_data() << ")" << std::endl;
try {
cursor[2].move(&c2o_key, &c2o_record,
HAM_CURSOR_NEXT|HAM_ONLY_DUPLICATES);
}
catch (ham::error &e) {
if (e.get_errno()==HAM_KEY_NOT_FOUND)
break;
else {
std::cerr << "cursor.move() failed: " << e.get_string()
<< std::endl;
return (-1);
}
}
} while(1);
}
std::cout << "success!" << std::endl;
return (0);
}
int
main(int argc, char **argv)
{
try {
return (run_demo());
}
catch (ham::error &e) {
std::cerr << "run_demo() failed with unexpected error "
<< e.get_errno() << " ('"
<< e.get_string() << "')" << std::endl;
return (-1);
}
}