1. // addressBook_v2.cpp: Andrew Levenson
  2. //
  3. // Description: An attempt at making a simple address book using OO methods.
  4. // Thanks to rizlah from ##c++-basic @ Freenode for fixing the code from V1.
  5.  
  6. #include <list>
  7. #include <string>
  8. #include <vector>
  9. #include <iostream>
  10. #include <algorithm>
  11. #include "mysqlinfo.h"
  12.  
  13. /* MySQL Connector/C++ specific headers */
  14. #include <cppconn/driver.h>
  15. #include <cppconn/connection.h>
  16. #include <cppconn/statement.h>
  17. #include <cppconn/prepared_statement.h>
  18. #include <cppconn/resultset.h>
  19. #include <cppconn/metadata.h>
  20. #include <cppconn/resultset_metadata.h>
  21. #include <cppconn/exception.h>
  22. #include <cppconn/warning.h>
  23.  
  24. struct addressCard
  25. {
  26.     std::string fName;
  27.     std::string lName;
  28.     std::string phone;
  29.     std::string email;
  30.     std::string city;
  31.     std::string comments;
  32. };
  33.  
  34. class addressBook
  35. {
  36. public:
  37.  
  38.     void insert(addressCard, sql::Connection*);
  39.     void remove(std::string, std::string, sql::Connection*);
  40.     void display(sql::Connection*);
  41. };
  42.  
  43. addressCard
  44. create_card()
  45. {
  46.     addressCard newCard;
  47.    
  48.     std::cout << "Please enter in the fields as they appear;\n\n"
  49.           << "\tName:\t";
  50.     std::cin >> newCard.fName >> newCard.lName;
  51.     std::cin.get();
  52.  
  53.     std::cout << "\tPhone:\t   ";
  54.     getline(std::cin, newCard.phone);
  55.  
  56.     std::cout << "\teMail:\t   ";
  57.     getline(std::cin, newCard.email);
  58.  
  59.     std::cout << "\tCity:\t   ";
  60.     getline(std::cin, newCard.city);
  61.  
  62.     std::cout << "\tComments:  ";
  63.     getline(std::cin, newCard.comments);
  64.    
  65.     return newCard;
  66. }
  67.    
  68.    
  69.  
  70. void
  71. display_card(addressCard const & card)
  72. {
  73.     std::cout << "\nName:\t   "
  74.           << card.fName
  75.           << " "
  76.           << card.lName    << std::endl;
  77.     std::cout << "Phone:\t   "
  78.           << card.phone    << std::endl;
  79.     std::cout << "eMail:\t   "
  80.           << card.email    << std::endl;
  81.     std::cout << "City:\t   "
  82.           << card.city     << std::endl;
  83.     std::cout << "Comments:  "
  84.           << card.comments << std::endl;
  85. }
  86.  
  87. void
  88. addressBook::insert(addressCard card, sql::Connection* con)
  89. {
  90.     sql::PreparedStatement *p_stmt;
  91.  
  92.     // Create a prepared statement into which
  93.     // the appropriate fields may be entered
  94.     p_stmt = con->prepareStatement
  95.     ("INSERT INTO address_book "
  96.      "(first_name, last_name, phone, email, city, comments) "
  97.      "VALUES (?,?,?,?,?,?)");
  98.     // Substitute the appropriate fields into the query
  99.     p_stmt->setString(1, card.fName);
  100.     p_stmt->setString(2, card.lName);
  101.     p_stmt->setString(3, card.phone);
  102.     p_stmt->setString(4, card.email);
  103.     p_stmt->setString(5, card.city);
  104.     p_stmt->setString(6, card.comments);
  105.     // Update the query with the changes made, and commit.
  106.     p_stmt->executeUpdate();
  107.     con->commit();
  108.  
  109.     delete p_stmt;
  110. }
  111.  
  112. void
  113. addressBook::remove(std::string fName,
  114.             std::string lName,
  115.             sql::Connection* con)
  116. {
  117.     sql::PreparedStatement *p_stmt;
  118.  
  119.     // Create a prepared statement using the supplied
  120.     // first and last name, to delete the indicated entry
  121.     // from the table in the MySQL database.
  122.     p_stmt = con->prepareStatement
  123.     ("DELETE FROM address_book WHERE "
  124.      "first_name = (?) AND last_name = (?)");
  125.     // Substitute in the appropriate fields for the DELETE statement
  126.     p_stmt->setString(1, fName);
  127.     p_stmt->setString(2, lName);
  128.     // Update the query with the changes, and commit the query
  129.     p_stmt->executeUpdate();
  130.     con->commit();
  131.  
  132.     delete p_stmt;
  133. }
  134.  
  135. void
  136. addressBook::display(sql::Connection* con)
  137. {
  138.     sql::Statement *stmt;
  139.     sql::ResultSet *res;
  140.  
  141.     // Create the statement object
  142.     stmt = con->createStatement();
  143.  
  144.     // Execute a query and store the result in res
  145.     res = stmt->executeQuery("SELECT * FROM address_book "
  146.                  "ORDER BY last_name, first_name");
  147.    
  148.     // Loop through the results and display them
  149.     if(res)
  150.     {
  151.     while(res->next())
  152.     {
  153.         std::cout << "Name: " << res->getString("first_name");
  154.               << " "    << res->getString("last_name") << std::endl
  155.               << "Phone: " << res->getString("phone") << std::endl
  156.               << "eMail: " << res->getString("email") << std::endl
  157.               << "City: " << res->getString("city") << std::endl
  158.               << "Comments: " << res->getString("comments")
  159.               << std::endl << std::endl;
  160.     }
  161.     }
  162.     delete stmt;
  163.     delete res;
  164. }
  165.  
  166. void
  167. display_menu()
  168. {
  169.     std::cout << "Would you like to:\n\n"
  170.           << "\t1. Add a new address card\n"
  171.           << "\t2. Delete an existing address card\n"
  172.           << "\t3. View your address book\n"
  173.           << "\t4. Quit\n\t::";
  174. }
  175.  
  176. int
  177. get_choice()
  178. {
  179.     int choice = 0;
  180.     while(choice > 4 || choice < 1)
  181.     {
  182.     if(!(std::cin >> choice))
  183.     {
  184.         std::cout << "Please only enter in numbers.\n";
  185.         std::cin.clear();
  186.         std::cin.ignore(255,'\n');
  187.     }
  188.    
  189.     if(choice < 1 || choice > 4)
  190.     {
  191.         std::cout << "Please enter a number between 1 and 4 to "
  192.               << "indicate your choice.\n\t::";
  193.     }
  194.     }
  195.     return choice;    
  196. }
  197.  
  198. int
  199. main()
  200. {    
  201.     sql::Driver            *driver;
  202.     sql::Connection        *connection;
  203.     /*
  204.       sql::Statement         *statement;
  205.       sql::ResultSet         *resultSet;
  206.       sql::PreparedStatement *preparedStatement;
  207.       sql::Savepoint         *savepoint;
  208.     */
  209.  
  210.     try
  211.     {
  212.     driver = get_driver_instance();
  213.  
  214.     // Create a DB connection using the Driver
  215.     connection = driver->connect("localhost",USER,PASSWD);
  216.  
  217.     // Turn off Autocommit
  218.     connection->setAutoCommit(0);
  219.  
  220.     // Select appropriate database schema
  221.     connection->setSchema(DATABASE);
  222.    
  223.     } catch (sql::SQLException &e)
  224.     {
  225.     std::cout << "ERROR: SQLException in " << __FILE__;
  226.     std::cout << " (" << __func__<< ") on line "
  227.           << __LINE__ << std::endl;
  228.     std::cout << "ERROR: " << e.what();
  229.     std::cout << " (MySQL error code: " << e.getErrorCode();
  230.     std::cout << ", SQLState: " << e.getSQLState() << ")" << std::endl;
  231.    
  232.     if(e.getErrorCode() == 1047)
  233.     {
  234.         /*
  235.           Error: 1047 SQLSTATE: 08S01 (ER_UNKNOWN_COM_ERROR)
  236.           Message: Unknown command
  237.         */
  238.         std::cout << "\nYour server does not seem to support"
  239.               << "Prepared Statements at all. ";
  240.         std::cout << "Perhaps MYSQL < 4.1?" << std::endl;
  241.     }
  242.  
  243.     return EXIT_FAILURE;
  244.    
  245.     } catch (std::runtime_error &e)
  246.     {
  247.    
  248.     std::cout << "ERROR: runtime_error in " << __FILE__;
  249.     std::cout << " (" << __func__ << ") on line "
  250.           << __LINE__ << std::endl;
  251.     std::cout << "ERROR: " << e.what() << std::endl;
  252.    
  253.     return EXIT_FAILURE;
  254.     }
  255.    
  256.     std::cout << "Welcome to your Address Book!" << std::endl;
  257.  
  258.     addressBook * aBook = new addressBook;
  259.  
  260.     int choice = 0;
  261.     while(choice != 4)
  262.     {
  263.     display_menu();
  264.     choice = get_choice();
  265.  
  266.     addressCard newCard;
  267.     std::string first, last;
  268.     switch(choice)
  269.     {
  270.     case 1:
  271.         newCard = create_card();
  272.         aBook->insert(newCard, connection);
  273.         break;
  274.     case 2:
  275.         std::cout << "Please enter the name of the card to remove: ";
  276.         std::cin.get();
  277.         std::cin >> first >> last;
  278.         std::cin.get();
  279.         aBook->remove(first, last, connection);
  280.         break;
  281.     case 3:
  282.         aBook->display(connection);
  283.         break;
  284.     }
  285.     }
  286.  
  287.     connection->close();
  288.     delete connection;
  289.     delete aBook;
  290.     return 0;
  291. }