// addressBook_v2.cpp: Andrew Levenson
//
// Description: An attempt at making a simple address book using OO methods.
// Thanks to rizlah from ##c++-basic @ Freenode for fixing the code from V1.
#include <list>
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include "mysqlinfo.h"
/* MySQL Connector/C++ specific headers */
#include <cppconn/driver.h>
#include <cppconn/connection.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h>
#include <cppconn/resultset.h>
#include <cppconn/metadata.h>
#include <cppconn/resultset_metadata.h>
#include <cppconn/exception.h>
#include <cppconn/warning.h>
struct addressCard
{
std::string fName;
std::string lName;
std::string phone;
std::string email;
std::string city;
std::string comments;
};
class addressBook
{
public:
void insert(addressCard, sql::Connection*);
void remove(std::string, std::string, sql::Connection*);
void display(sql::Connection*);
};
addressCard
create_card()
{
addressCard newCard;
std::cout << "Please enter in the fields as they appear;\n\n"
<< "\tName:\t";
std::cin >> newCard.fName >> newCard.lName;
std::cin.get();
std::cout << "\tPhone:\t ";
getline(std::cin, newCard.phone);
std::cout << "\teMail:\t ";
getline(std::cin, newCard.email);
std::cout << "\tCity:\t ";
getline(std::cin, newCard.city);
std::cout << "\tComments: ";
getline(std::cin, newCard.comments);
return newCard;
}
void
display_card(addressCard const & card)
{
std::cout << "\nName:\t "
<< card.fName
<< " "
<< card.lName << std::endl;
std::cout << "Phone:\t "
<< card.phone << std::endl;
std::cout << "eMail:\t "
<< card.email << std::endl;
std::cout << "City:\t "
<< card.city << std::endl;
std::cout << "Comments: "
<< card.comments << std::endl;
}
void
addressBook::insert(addressCard card, sql::Connection* con)
{
sql::PreparedStatement *p_stmt;
// Create a prepared statement into which
// the appropriate fields may be entered
p_stmt = con->prepareStatement
("INSERT INTO address_book "
"(first_name, last_name, phone, email, city, comments) "
"VALUES (?,?,?,?,?,?)");
// Substitute the appropriate fields into the query
p_stmt->setString(1, card.fName);
p_stmt->setString(2, card.lName);
p_stmt->setString(3, card.phone);
p_stmt->setString(4, card.email);
p_stmt->setString(5, card.city);
p_stmt->setString(6, card.comments);
// Update the query with the changes made, and commit.
p_stmt->executeUpdate();
con->commit();
delete p_stmt;
}
void
addressBook::remove(std::string fName,
std::string lName,
sql::Connection* con)
{
sql::PreparedStatement *p_stmt;
// Create a prepared statement using the supplied
// first and last name, to delete the indicated entry
// from the table in the MySQL database.
p_stmt = con->prepareStatement
("DELETE FROM address_book WHERE "
"first_name = (?) AND last_name = (?)");
// Substitute in the appropriate fields for the DELETE statement
p_stmt->setString(1, fName);
p_stmt->setString(2, lName);
// Update the query with the changes, and commit the query
p_stmt->executeUpdate();
con->commit();
delete p_stmt;
}
void
addressBook::display(sql::Connection* con)
{
sql::Statement *stmt;
sql::ResultSet *res;
// Create the statement object
stmt = con->createStatement();
// Execute a query and store the result in res
res = stmt->executeQuery("SELECT * FROM address_book "
"ORDER BY last_name, first_name");
// Loop through the results and display them
if(res)
{
while(res->next())
{
std::cout << "Name: " << res->getString("first_name");
<< " " << res->getString("last_name") << std::endl
<< "Phone: " << res->getString("phone") << std::endl
<< "eMail: " << res->getString("email") << std::endl
<< "City: " << res->getString("city") << std::endl
<< "Comments: " << res->getString("comments")
<< std::endl << std::endl;
}
}
delete stmt;
delete res;
}
void
display_menu()
{
std::cout << "Would you like to:\n\n"
<< "\t1. Add a new address card\n"
<< "\t2. Delete an existing address card\n"
<< "\t3. View your address book\n"
<< "\t4. Quit\n\t::";
}
int
get_choice()
{
int choice = 0;
while(choice > 4 || choice < 1)
{
if(!(std::cin >> choice))
{
std::cout << "Please only enter in numbers.\n";
std::cin.clear();
std::cin.ignore(255,'\n');
}
if(choice < 1 || choice > 4)
{
std::cout << "Please enter a number between 1 and 4 to "
<< "indicate your choice.\n\t::";
}
}
return choice;
}
int
main()
{
sql::Driver *driver;
sql::Connection *connection;
/*
sql::Statement *statement;
sql::ResultSet *resultSet;
sql::PreparedStatement *preparedStatement;
sql::Savepoint *savepoint;
*/
try
{
driver = get_driver_instance();
// Create a DB connection using the Driver
connection = driver->connect("localhost",USER,PASSWD);
// Turn off Autocommit
connection->setAutoCommit(0);
// Select appropriate database schema
connection->setSchema(DATABASE);
} catch (sql::SQLException &e)
{
std::cout << "ERROR: SQLException in " << __FILE__;
std::cout << " (" << __func__<< ") on line "
<< __LINE__ << std::endl;
std::cout << "ERROR: " << e.what();
std::cout << " (MySQL error code: " << e.getErrorCode();
std::cout << ", SQLState: " << e.getSQLState() << ")" << std::endl;
if(e.getErrorCode() == 1047)
{
/*
Error: 1047 SQLSTATE: 08S01 (ER_UNKNOWN_COM_ERROR)
Message: Unknown command
*/
std::cout << "\nYour server does not seem to support"
<< "Prepared Statements at all. ";
std::cout << "Perhaps MYSQL < 4.1?" << std::endl;
}
return EXIT_FAILURE;
} catch (std::runtime_error &e)
{
std::cout << "ERROR: runtime_error in " << __FILE__;
std::cout << " (" << __func__ << ") on line "
<< __LINE__ << std::endl;
std::cout << "ERROR: " << e.what() << std::endl;
return EXIT_FAILURE;
}
std::cout << "Welcome to your Address Book!" << std::endl;
addressBook * aBook = new addressBook;
int choice = 0;
while(choice != 4)
{
display_menu();
choice = get_choice();
addressCard newCard;
std::string first, last;
switch(choice)
{
case 1:
newCard = create_card();
aBook->insert(newCard, connection);
break;
case 2:
std::cout << "Please enter the name of the card to remove: ";
std::cin.get();
std::cin >> first >> last;
std::cin.get();
aBook->remove(first, last, connection);
break;
case 3:
aBook->display(connection);
break;
}
}
connection->close();
delete connection;
delete aBook;
return 0;
}