example_database_load.c [plain text]
#include "gettingstarted_common.h"
int usage(void);
int load_vendors_database(STOCK_DBS, char *);
size_t pack_string(char *, char *, size_t);
int load_inventory_database(STOCK_DBS, char *);
int
usage()
{
fprintf(stderr, "example_database_load [-b <path to data files>]");
fprintf(stderr, " [-h <database_home_directory>]\n");
fprintf(stderr, "\tNote: Any path specified must end with your");
fprintf(stderr, " system's path delimiter (/ or \\)\n");
return (-1);
}
int
main(int argc, char *argv[])
{
STOCK_DBS my_stock;
int ch, ret;
size_t size;
char *basename, *inventory_file, *vendor_file;
initialize_stockdbs(&my_stock);
basename = "./";
while ((ch = getopt(argc, argv, "b:h:")) != EOF)
switch (ch) {
case 'h':
if (optarg[strlen(optarg)-1] != '/' &&
optarg[strlen(optarg)-1] != '\\')
return (usage());
my_stock.db_home_dir = optarg;
break;
case 'b':
if (basename[strlen(basename)-1] != '/' &&
basename[strlen(basename)-1] != '\\')
return (usage());
basename = optarg;
break;
case '?':
default:
return (usage());
}
set_db_filenames(&my_stock);
size = strlen(basename) + strlen(INVENTORY_FILE) + 1;
inventory_file = malloc(size);
snprintf(inventory_file, size, "%s%s", basename, INVENTORY_FILE);
size = strlen(basename) + strlen(VENDORS_FILE) + 1;
vendor_file = malloc(size);
snprintf(vendor_file, size, "%s%s", basename, VENDORS_FILE);
ret = databases_setup(&my_stock, "example_database_load", stderr);
if (ret) {
fprintf(stderr, "Error opening databases\n");
databases_close(&my_stock);
return (ret);
}
ret = load_vendors_database(my_stock, vendor_file);
if (ret) {
fprintf(stderr, "Error loading vendors database.\n");
databases_close(&my_stock);
return (ret);
}
ret = load_inventory_database(my_stock, inventory_file);
if (ret) {
fprintf(stderr, "Error loading inventory database.\n");
databases_close(&my_stock);
return (ret);
}
databases_close(&my_stock);
printf("Done loading databases.\n");
return (ret);
}
int
load_vendors_database(STOCK_DBS my_stock, char *vendor_file)
{
DBT key, data;
char buf[MAXLINE];
FILE *ifp;
VENDOR my_vendor;
ifp = fopen(vendor_file, "r");
if (ifp == NULL) {
fprintf(stderr, "Error opening file '%s'\n", vendor_file);
return (-1);
}
while (fgets(buf, MAXLINE, ifp) != NULL) {
memset(&my_vendor, 0, sizeof(VENDOR));
memset(&key, 0, sizeof(DBT));
memset(&data, 0, sizeof(DBT));
sscanf(buf,
"%20[^#]#%20[^#]#%20[^#]#%3[^#]#%6[^#]#%13[^#]#%20[^#]#%20[^\n]",
my_vendor.name, my_vendor.street,
my_vendor.city, my_vendor.state,
my_vendor.zipcode, my_vendor.phone_number,
my_vendor.sales_rep, my_vendor.sales_rep_phone);
key.data = my_vendor.name;
key.size = (u_int32_t)strlen(my_vendor.name) + 1;
data.data = &my_vendor;
data.size = sizeof(VENDOR);
my_stock.vendor_dbp->put(my_stock.vendor_dbp, 0, &key, &data, 0);
}
fclose(ifp);
return (0);
}
size_t
pack_string(char *buffer, char *string, size_t start_pos)
{
size_t string_size;
string_size = strlen(string) + 1;
memcpy(buffer+start_pos, string, string_size);
return (start_pos + string_size);
}
int
load_inventory_database(STOCK_DBS my_stock, char *inventory_file)
{
DBT key, data;
char buf[MAXLINE];
char databuf[MAXDATABUF];
size_t bufLen, dataLen;
FILE *ifp;
float price;
int quantity;
char category[MAXFIELD], name[MAXFIELD];
char vendor[MAXFIELD], sku[MAXFIELD];
ifp = fopen(inventory_file, "r");
if (ifp == NULL) {
fprintf(stderr, "Error opening file '%s'\n", inventory_file);
return (-1);
}
while (fgets(buf, MAXLINE, ifp) != NULL) {
sscanf(buf,
"%20[^#]#%20[^#]#%f#%i#%20[^#]#%20[^\n]",
name, sku, &price, &quantity, category, vendor);
memset(databuf, 0, MAXDATABUF);
bufLen = 0;
dataLen = 0;
dataLen = sizeof(float);
memcpy(databuf, &price, dataLen);
bufLen += dataLen;
dataLen = sizeof(int);
memcpy(databuf + bufLen, &quantity, dataLen);
bufLen += dataLen;
bufLen = pack_string(databuf, name, bufLen);
bufLen = pack_string(databuf, sku, bufLen);
bufLen = pack_string(databuf, category, bufLen);
bufLen = pack_string(databuf, vendor, bufLen);
memset(&key, 0, sizeof(DBT));
memset(&data, 0, sizeof(DBT));
key.data = sku;
key.size = (u_int32_t)strlen(sku) + 1;
data.data = databuf;
data.size = (u_int32_t)bufLen;
my_stock.vendor_dbp->put(my_stock.inventory_dbp, 0, &key, &data, 0);
}
fclose(ifp);
return (0);
}