View difference between Paste ID: kWnknHi4 and
SHOW:
|
|
- or go back to the newest paste.
| 1 | - | |
| 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 | } |