From d8fd94e87ea1f6dfba58b9e12d3acbcb4db4b5d3 Mon Sep 17 00:00:00 2001 From: grantb3 Date: Mon, 25 Feb 2019 01:07:22 +0000 Subject: [PATCH] Database connectivity, and all logic surrounding DB -> Beverage object --- Sample.cpp | 132 ---------------------------------------------------- Time.cpp | 92 ------------------------------------ cocktail.db | Bin 0 -> 73728 bytes db.h | 94 +++++++++++++++++++++++++++++++++++++ objects.h | 97 +++++++++++++++++++++++++++++++++----- tests.cpp | 68 +++++++++------------------ 6 files changed, 202 insertions(+), 281 deletions(-) delete mode 100644 Sample.cpp delete mode 100644 Time.cpp create mode 100644 cocktail.db create mode 100644 db.h diff --git a/Sample.cpp b/Sample.cpp deleted file mode 100644 index 678a41c..0000000 --- a/Sample.cpp +++ /dev/null @@ -1,132 +0,0 @@ -#include -int main() -{ - //normal start - initscr(); - // do not show user input - noecho(); - //enable copy - cbreak(); - //enable colours - start_color(); - - //printw("Terminal does not support colors"); - - //get screen size - bool ScrSmall = false; - int yMax , xMax; - getmaxyx(stdscr, yMax, xMax); - - init_pair(1, COLOR_RED, COLOR_BLACK); - init_pair(2, COLOR_WHITE, COLOR_WHITE); - init_pair(3, COLOR_WHITE, COLOR_GREEN); - init_pair(4, COLOR_RED, COLOR_RED); - - WINDOW * ingredients = newwin( 3, 20, 7, 5); - box(ingredients, 0, 0); - refresh(); - wrefresh(ingredients); - - wbkgd(ingredients, COLOR_PAIR(2)); - - wattron(ingredients, COLOR_PAIR(1)); - mvwprintw(ingredients, 1, 1, "INGREDIENTS"); - wattroff(ingredients, COLOR_PAIR(1)); - - wrefresh(ingredients); - - WINDOW * ingr2 = newwin( 20, 20, 10, 5); - box(ingr2, 0, 0); - refresh(); - wrefresh(ingr2); - - wbkgd(ingr2, COLOR_PAIR(3)); - - wattron(ingr2, COLOR_PAIR(1)); - mvwprintw(ingr2, 1, 1, "Vodka\n"); - mvwprintw(ingr2, 2, 1, "Whisky\n"); - mvwprintw(ingr2, 3, 1, "Ice\n"); - wattroff(ingr2, COLOR_PAIR(1)); - - wrefresh(ingr2); - - WINDOW * glass = newwin( 3, 20, 7, 27); - box(glass, 0, 0); - refresh(); - wrefresh(glass); - - wbkgd(glass, COLOR_PAIR(2)); - - wattron(glass, COLOR_PAIR(1)); - mvwprintw(glass, 1, 1, "GLASS"); - wattroff(glass, COLOR_PAIR(1)); - - wrefresh(glass); - - WINDOW * glass2 = newwin( 20, 20, 10, 27); - box(glass2, 0, 0); - refresh(); - wrefresh(glass2); - - wbkgd(glass2, COLOR_PAIR(3)); - - wattron(glass2, COLOR_PAIR(1)); - mvwprintw(glass2, 1, 1, "Tall\n"); - mvwprintw(glass2, 2, 1, "Small\n"); - mvwprintw(glass2, 3, 1, "Wine\n"); - wattroff(glass2, COLOR_PAIR(1)); - - wrefresh(glass2); - - WINDOW * decoration = newwin( 3, 20, 7, 49); - box(decoration, 0, 0); - refresh(); - wrefresh(decoration); - - wbkgd(decoration, COLOR_PAIR(2)); - - wattron(decoration, COLOR_PAIR(1)); - mvwprintw(decoration, 1, 1, "DECORATION"); - wattroff(decoration, COLOR_PAIR(1)); - - wrefresh(decoration); - - WINDOW * dec2 = newwin( 20, 20, 10, 49); - box(dec2, 0, 0); - refresh(); - wrefresh(dec2); - - wbkgd(dec2, COLOR_PAIR(3)); - - wattron(dec2, COLOR_PAIR(1)); - mvwprintw(dec2, 1, 1, "Peppermint\n"); - mvwprintw(dec2, 2, 1, "Lemon\n"); - mvwprintw(dec2, 3, 1, "Umbrella\n"); - wattroff(dec2, COLOR_PAIR(1)); - - wrefresh(dec2); - - WINDOW * settings = newwin( 3, 17, 1, 5); - box(settings, 0, 0); - refresh(); - wrefresh(settings); - - wbkgd(settings, COLOR_PAIR(4)); - - wattron(settings, COLOR_PAIR(1)); - mvwprintw(settings, 1, 1, "SETTINGS"); - wattroff(settings, COLOR_PAIR(1)); - - wrefresh(settings); - - mvprintw ( 1, 30, " ## # # # # # ### ### ### #" ); - mvprintw ( 2, 30, "# # # # # # # # # # #" ); - mvprintw ( 3, 30, " # ### ### ## ## # # #" ); - mvprintw ( 4, 30, " # # # # # # # # # # " ); - mvprintw ( 5, 30, "## # # # # # # ### ### # #" ); - - //asserts that program writes before exiting - getch(); - endwin(); - return 0; -} \ No newline at end of file diff --git a/Time.cpp b/Time.cpp deleted file mode 100644 index b421b04..0000000 --- a/Time.cpp +++ /dev/null @@ -1,92 +0,0 @@ -#include -#include - -int main() -{ - - for(int i = 0; i < 7; i++){ - - switch(i){ - - case 0: - std::cout << "*Player Ballance*" << std::endl << "MON" << std::endl ; // return case_player_ballance() from and set orders_curr() = 0 and set custommer_curr() = 0 - break; - case 1: - std::cout << "*Player Ballance*" << std::endl << "TUE" << std::endl ; - break; - case 2: - std::cout << "*Player Ballance*" << std::endl << "WED" << std::endl ; - break; - case 3: - std::cout << "*Player Ballance*" << std::endl << "THUR"<< std::endl ; - break; - case 4: - std::cout << "*Player Ballance*" << std::endl << "FRI" << std::endl ; - break; - case 5: - std::cout << "*Player Ballance*" << std::endl << "SAT" << std::endl ; - break; - case 6: - std::cout << "*Player Ballance*" << std::endl << "SUN" << std::endl ; // return case_player_ballance() as final; Score based on how much money player has on day 7 - break; - } - - std::chrono::steady_clock::time_point tend = std::chrono::steady_clock::now() - + std::chrono::seconds(10); - while (std::chrono::steady_clock::now() < tend) - { - continue; - } - - } - - /*std::cout << "Begin" << std::endl; - std::chrono::steady_clock::time_point tend = std::chrono::steady_clock::now() - + std::chrono::seconds(10); - while (std::chrono::steady_clock::now() < tend) - { - // logical statemnt implied for video game - } - std::cout << "Player Ballance.SQL\n"; - std::cout << "MON\n"; - tend = std::chrono::steady_clock::now() - + std::chrono::seconds(10); - while (std::chrono::steady_clock::now() < tend) - { - // logical statemnt implied for video game - } - std::cout << "Player Ballance.SQL\n"; - std::cout << "TUE\n"; - tend = std::chrono::steady_clock::now() - + std::chrono::seconds(10); - while (std::chrono::steady_clock::now() < tend) - { - // logical statemnt implied for video game - } - std::cout << "Player Ballance.SQL\n"; - std::cout << "WED\n"; - std::cout << "Begin\n"; - tend = std::chrono::steady_clock::now() - + std::chrono::seconds(10); - while (std::chrono::steady_clock::now() < tend) - { - // logical statemnt implied for video game - } - std::cout << "Player Ballance.SQL\n"; - std::cout << "THUR\n"; - std::cout << "Begin\n"; - tend = std::chrono::steady_clock::now() - + std::chrono::seconds(10); - while (std::chrono::steady_clock::now() < tend) - { - // logical statemnt implied for video game - } - std::cout << "Player Ballance.SQL\n"; - std::cout << "FRI\n"; - std::cout << "End of Round\n"; - */ - -} - -//import database relations -//change function name \ No newline at end of file diff --git a/cocktail.db b/cocktail.db new file mode 100644 index 0000000000000000000000000000000000000000..ff67a5bfedd3cd9ee8d6cede7afd7216e6c664d1 GIT binary patch literal 73728 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 literal 0 HcmV?d00001 diff --git a/db.h b/db.h new file mode 100644 index 0000000..2a557ce --- /dev/null +++ b/db.h @@ -0,0 +1,94 @@ +#ifndef SQLITE_H +#define SQLITE_H + + + +#include +#include +#include +#include + +using namespace std; + +class Row { + + public: + + Row(vector data){ + columns = data; + } + + vector getColumns(){ + return columns; + } + + private: + vector columns; +}; + +/* + + Code written after following tutorial from https://www.dreamincode.net/forums/topic/122300-sqlite-in-c/ + + No code was reused or taken, however the information was applied. + + */ +class Database{ + + public: + + sqlite3 *database; + + Database(string dbName){ + + if( sqlite3_open(dbName.c_str(), &database) ) { // should return 0, or false, if run successfully + error = true; + } else{ + error = false; + } + + } + + void close(){ + sqlite3_close(database); + } + + bool hasError(){ + return error; + } + + vector query(string statementString){ + + sqlite3_stmt *statement; + vector rows; + if(sqlite3_prepare_v2(database, statementString.c_str(), -1, &statement, 0) == SQLITE_OK){ // sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt **ppStmt, const char **pzTail + + int columnCount = sqlite3_column_count(statement); + + while(sqlite3_step(statement) == SQLITE_ROW){ + + vector columns; + + for(int column = 0; column < columnCount; column++){ + columns.push_back(string((const char*)sqlite3_column_text(statement, column))); // cast to 'const char*' so we can call string() function + } + + rows.push_back(Row(columns)); + + } + + sqlite3_finalize(statement); + + + + } + + return rows; + + } + + private: + bool error; +}; + +#endif \ No newline at end of file diff --git a/objects.h b/objects.h index a77d714..f533166 100644 --- a/objects.h +++ b/objects.h @@ -3,8 +3,12 @@ #include #include +#include "db.h" +#include -enum class Glass { +/* Enums no longer used due to database implementation. Kept in to display complex technique understanding. */ +enum class Glass +{ tall, shot, normal @@ -16,11 +20,11 @@ enum class Decoration lime }; -enum Ingredient -{ +enum Ingredient { vodka, lemonade }; +/* Enums no longer used due to database implementation. Kept in to display complex technique understanding. */ class Beverage { @@ -30,23 +34,23 @@ class Beverage return name; } - Glass getGlassType() const { + std::string getGlassType() const { return glassType; } - Decoration getDecoration() const { + std::string getDecoration() const { return decoration; } - std::vector getRecipe() const { + std::vector getRecipe() const { return recipe; } void setName(std::string newName) { //does edit class so not const name = newName; } - - Beverage(std::string drink_name, std::vector rec, Decoration deco, Glass glass) + + Beverage(std::string drink_name, std::vector rec, std::string deco, std::string glass) { name = drink_name; recipe = rec; @@ -56,9 +60,80 @@ class Beverage private: std::string name; - Glass glassType; - std::vector recipe; - Decoration decoration; + std::string glassType; + std::vector recipe; + std::string decoration; +}; + +class Helper +{ + public: + + std::map getIngredients() const { + return ingredients; + } + + std::vector getDecorations() const { + return decorations; + } + + std::vector getGlasses() const { + return glasses; + } + + Beverage rowToCocktail(Row row, Database db){ + + std::vector columns = row.getColumns(); + + std::string glass = db.query("SELECT GlassType FROM Glass WHERE ID_Glass='"+columns[2]+"';")[0].getColumns()[0]; + + std::vector ingredientList; + std::vector ingredientIds = db.query("SELECT ID_Ing FROM Recipe WHERE ID_Bev='"+columns[0]+"';"); + + for(int ing = 0; ing < ingredientIds.size(); ing++){ + + std::vector columns = ingredientIds[ing].getColumns(); + ingredientList.push_back(db.query("SELECT IngName FROM Ingredient WHERE ID_Ing='"+columns[0]+"';")[0].getColumns()[0]); + + } + + return Beverage(columns[1], ingredientList, "Lime", glass); + } + + void initialiseObjectsFromDatabase(Database db) + { + + std::vector ingredientRows = db.query("SELECT IngName, IngPrice FROM Ingredient;"); + + for(int row = 0; row < ingredientRows.size(); row++) + { + std::vector columns = ingredientRows[row].getColumns(); + ingredients[columns[0]] = std::stod(columns[1]); + } + + std::vector decorationRows = db.query("SELECT DecName FROM Decoration;"); + + for(int dec = 0; dec < decorationRows.size(); dec++) + { + std::vector columns = decorationRows[dec].getColumns(); + decorations.push_back(columns[0]); + } + + std::vector glassRows = db.query("SELECT DecName FROM Decoration;"); + + for(int glass = 0; glass < glassRows.size(); glass++) + { + std::vector columns = glassRows[glass].getColumns(); + glasses.push_back(columns[0]); + } + + } + + private: + std::map ingredients; + std::vector decorations; + std::vector glasses; + }; #endif \ No newline at end of file diff --git a/tests.cpp b/tests.cpp index be83823..7ece0dd 100644 --- a/tests.cpp +++ b/tests.cpp @@ -7,55 +7,21 @@ using namespace std; void printCocktailMetadata(Beverage bev){ - cout << "Cocktail Metadata:" << endl << "------------------" << endl << "Name: " << bev.getName() << endl << "Glass type: "; - - switch(bev.getGlassType()){ - case Glass::normal: - cout << "Normal" << endl; - break; - case Glass::shot: - cout << "Shot" << endl; - break; - case Glass::tall: - cout << "Tall" << endl; - break; - default: - cout << "Unknown" << endl; - break; - } + cout << "------------------" << endl << "Cocktail Metadata:" << endl << "------------------" << endl << "Name: " << bev.getName() << endl << "Glass type: "; + + cout << bev.getGlassType() << endl; cout << "Decoration: "; - - switch(bev.getDecoration()){ - case Decoration::lime: - cout << "Lime" << endl; - break; - case Decoration::none: - cout << "None" << endl; - break; - default: - cout << "Unknown" << endl; - break; - } - + + cout << bev.getDecoration() << endl; + cout << "Recipe: "; - std::vector recipe = bev.getRecipe(); + std::vector recipe = bev.getRecipe(); - for(vector::iterator recipeIterator = recipe.begin(); recipeIterator != recipe.end(); recipeIterator++) + for(std::vector::iterator recipeIterator = recipe.begin(); recipeIterator != recipe.end(); recipeIterator++) { - switch(*recipeIterator) { - case vodka: - cout << "Vodka "; - break; - case lemonade: - cout << "Lemonade "; - break; - default: - cout << "Unknown "; - break; - } - cout << "+ "; + cout << *recipeIterator << " + "; } cout << endl; @@ -73,10 +39,20 @@ void testTimer(int seconds){ int main(){ - Beverage cocktail = Beverage("Example", {vodka, lemonade}, Decoration::none, Glass::normal); + Database db = Database("cocktail.db"); + Helper helper = Helper(); + + helper.initialiseObjectsFromDatabase(db); + cout << "COCKTAIL TEST:" << endl; - printCocktailMetadata(cocktail); + + vector bevs = db.query("SELECT * FROM Beverage"); + + for(int cocktail = 0; cocktail < bevs.size(); cocktail++){ + printCocktailMetadata(helper.rowToCocktail(bevs[cocktail], db)); + } + cout << endl << "TIMER TEST:" << endl; - testTimer(120); + testTimer(5); return 0; } \ No newline at end of file