RecipeDB/model/database/database.cpp

80 lines
2.2 KiB
C++
Raw Normal View History

#include "model/database/database.h"
2018-02-12 13:24:11 +00:00
Database::Database(string filename){
this->filename = filename;
openConnection();
}
2018-02-12 13:24:11 +00:00
Database::~Database(){
closeConnection();
}
ResultTable Database::executeSQL(string statement){
sqlite3_stmt* stmt;
this->sql = statement;
this->returnCode = sqlite3_prepare_v2(this->db, statement.c_str(), -1, &stmt, NULL);
ResultTable t;
if (this->returnCode != SQLITE_OK){
fprintf(stderr, "Unable to successfully prepare SQL statement. Error code: %d\n\tError Message: %s\n", this->returnCode, sqlite3_errmsg(this->db));
return t;
}
t.extractData(stmt);
this->returnCode = sqlite3_finalize(stmt);
return t;
}
bool Database::insertInto(string tableName, vector<string> columnNames, vector<string> values){
if (columnNames.size() != values.size() || columnNames.empty()){
return false;
}
string query = "INSERT INTO "+tableName+" (";
string cols = combineVector(columnNames, ", ");
string vals = combineVector(values, ", ");
query += cols + ") VALUES (" + vals + ");";
printf("Executing query: %s\n", query.c_str());
this->executeSQL(query);
return true;
}
void Database::openConnection(){
this->returnCode = sqlite3_open(this->filename.c_str(), &this->db);
2018-02-12 13:24:11 +00:00
if (this->returnCode || this->db == NULL){
this->dbIsOpen = false;
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
exit(EXIT_FAILURE);
2018-02-12 13:24:11 +00:00
} else {
this->dbIsOpen = true;
}
}
void Database::closeConnection(){
this->returnCode = sqlite3_close(this->db);
this->dbIsOpen = false;
}
string Database::combineVector(std::vector<string> strings, string mid){
if (strings.empty()){
return "";
}
std::string result = "'" + strings[0] + "'";
for (std::vector<std::string>::iterator it = strings.begin() + 1; it != strings.end(); ++it){
result += mid + "'" + (*it) + "'";
}
return result;
2018-02-12 13:24:11 +00:00
}
bool Database::tableExists(string tableName){
if (tableName.empty() || this->db == NULL || !this->dbIsOpen){
return false;
}
ResultTable t = executeSQL("SELECT name FROM sqlite_master WHERE type='table' AND name='"+tableName+"';");
return !t.isEmpty();
}
int Database::getLastInsertedRowId(){
return sqlite3_last_insert_rowid(this->db);
}