excxx_example_database_read.cpp [plain text]
#include <iostream>
#include <fstream>
#include <cstdlib>
#include "MyDb.hpp"
#include "gettingStartedCommon.hpp"
#ifdef _WIN32
extern "C" {
extern int getopt(int, char * const *, const char *);
extern char *optarg;
}
#else
#include <unistd.h>
#endif
int show_item(MyDb &itemnameSDB, MyDb &vendorDB, std::string &itemName);
int show_all_records(MyDb &inventoryDB, MyDb &vendorDB);
int show_vendor(MyDb &vendorDB, const char *vendor);
int
usage()
{
std::cout << "example_database_read [-i <path to data files>]"
<< " [-h <database home directory>]" << std::endl;
std::cout << "Note: Any path specified to the -h parameter must end"
<< " with your system's path delimiter (/ or \\)"
<< std::endl;
return (-1);
}
int
main (int argc, char *argv[])
{
char ch, lastChar;
std::string databaseHome("./");
std::string itemName;
std::string vDbName("vendordb.db");
std::string iDbName("inventorydb.db");
std::string itemSDbName("itemname.sdb");
while ((ch = getopt(argc, argv, "h:i:")) != EOF)
switch (ch) {
case 'h':
databaseHome = optarg;
lastChar = databaseHome[databaseHome.size() -1];
if (lastChar != '/' && lastChar != '\\')
return (usage());
break;
case 'i':
itemName = optarg;
break;
case '?':
default:
return (usage());
break;
}
try
{
MyDb inventoryDB(databaseHome, iDbName);
MyDb vendorDB(databaseHome, vDbName);
MyDb itemnameSDB(databaseHome, itemSDbName, true);
inventoryDB.getDb().associate(NULL,
&(itemnameSDB.getDb()),
get_item_name,
0);
if (itemName.empty())
{
show_all_records(inventoryDB, vendorDB);
} else {
show_item(itemnameSDB, vendorDB, itemName);
}
} catch(DbException &e) {
std::cerr << "Error reading databases. " << std::endl;
return (e.get_errno());
} catch(std::exception &e) {
std::cerr << "Error reading databases. " << std::endl;
std::cerr << e.what() << std::endl;
return (-1);
}
return (0);
}
int
show_item(MyDb &itemnameSDB, MyDb &vendorDB, std::string &itemName)
{
Dbc *cursorp;
try {
itemnameSDB.getDb().cursor(NULL, &cursorp, 0);
std::cout << "Looking for " << itemName << std::endl;
Dbt key((void *)itemName.c_str(), (u_int32_t)itemName.length() + 1);
Dbt data;
int ret = cursorp->get(&key, &data, DB_SET);
if (!ret) {
do {
InventoryData inventoryItem(data.get_data());
inventoryItem.show();
show_vendor(vendorDB, inventoryItem.getVendor().c_str());
} while (cursorp->get(&key, &data, DB_NEXT_DUP) == 0);
} else {
std::cerr << "No records found for '" << itemName
<< "'" << std::endl;
}
} catch(DbException &e) {
itemnameSDB.getDb().err(e.get_errno(), "Error in show_item");
cursorp->close();
throw e;
} catch(std::exception &e) {
itemnameSDB.getDb().errx("Error in show_item: %s", e.what());
cursorp->close();
throw e;
}
cursorp->close();
return (0);
}
int
show_all_records(MyDb &inventoryDB, MyDb &vendorDB)
{
Dbc *cursorp;
try {
inventoryDB.getDb().cursor(NULL, &cursorp, 0);
Dbt key, data;
int ret;
while ((ret = cursorp->get(&key, &data, DB_NEXT)) == 0 )
{
InventoryData inventoryItem(data.get_data());
inventoryItem.show();
show_vendor(vendorDB, inventoryItem.getVendor().c_str());
}
} catch(DbException &e) {
inventoryDB.getDb().err(e.get_errno(), "Error in show_all_records");
cursorp->close();
throw e;
} catch(std::exception &e) {
cursorp->close();
throw e;
}
cursorp->close();
return (0);
}
int
show_vendor(MyDb &vendorDB, const char *vendor)
{
Dbt data;
VENDOR my_vendor;
try {
Dbt key((char *)vendor, (u_int32_t)strlen(vendor) + 1);
data.set_data(&my_vendor);
data.set_ulen(sizeof(VENDOR));
data.set_flags(DB_DBT_USERMEM);
vendorDB.getDb().get(NULL, &key, &data, 0);
std::cout << " " << my_vendor.street << "\n"
<< " " << my_vendor.city << ", "
<< my_vendor.state << "\n"
<< " " << my_vendor.zipcode << "\n"
<< " " << my_vendor.phone_number << "\n"
<< " Contact: " << my_vendor.sales_rep << "\n"
<< " " << my_vendor.sales_rep_phone
<< std::endl;
} catch(DbException &e) {
vendorDB.getDb().err(e.get_errno(), "Error in show_vendor");
throw e;
} catch(std::exception &e) {
throw e;
}
return (0);
}