Skip to content

Commit

Permalink
Merge pull request #237 from FYP-Auto-Scale-JasmineGraph/refactor
Browse files Browse the repository at this point in the history
Extract Common Database Functions
  • Loading branch information
miyurud authored Feb 7, 2024
2 parents 1df46c3 + f411922 commit 331a7f8
Show file tree
Hide file tree
Showing 9 changed files with 182 additions and 424 deletions.
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ set(HEADERS src/backend/JasmineGraphBackend.h
src/k8s/K8sWorkerController.h
src/streamingdb/StreamingSQLiteDBInterface.h
src/frontend/core/executor/impl/PageRankExecutor.h
src/util/dbinterface/DBInterface.h
)

set(SOURCES src/backend/JasmineGraphBackend.cpp
Expand Down Expand Up @@ -130,6 +131,7 @@ set(SOURCES src/backend/JasmineGraphBackend.cpp
src/k8s/K8sWorkerController.cpp
src/streamingdb/StreamingSQLiteDBInterface.cpp
src/frontend/core/executor/impl/PageRankExecutor.cpp
src/util/dbinterface/DBInterface.cpp
)

add_library(JasmineGraphLib ${HEADERS} ${SOURCES})
Expand Down
123 changes: 0 additions & 123 deletions src/metadb/SQLiteDBInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ limitations under the License.
#include "SQLiteDBInterface.h"

#include <string>
#include <fstream>
#include <sstream>

#include "../util/Utils.h"
#include "../util/logger/Logger.h"
Expand Down Expand Up @@ -45,124 +43,3 @@ int SQLiteDBInterface::init() {
db_logger.info("Database opened successfully :" + this->databaseLocation);
return 0;
}

int SQLiteDBInterface::finalize() { return sqlite3_close(database); }


typedef vector<vector<pair<string, string>>> table_type;

static int callback(void *ptr, int argc, char **argv, char **azColName) {
int i;
table_type *dbResults = static_cast<table_type *>(ptr);
vector<pair<string, string>> results;

for (i = 0; i < argc; i++) {
results.push_back(make_pair(azColName[i], argv[i] ? argv[i] : "NULL"));
// printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
dbResults->push_back(results);
return 0;
}

vector<vector<pair<string, string>>> SQLiteDBInterface::runSelect(std::string query) {
char *zErrMsg = 0;
vector<vector<pair<string, string>>> dbResults;

if (sqlite3_exec(database, query.c_str(), callback, &dbResults, &zErrMsg) != SQLITE_OK) {
db_logger.log("SQL Error: " + string(zErrMsg) + " " + query, "error");
sqlite3_free(zErrMsg);
} else {
db_logger.log("Operation done successfully", "info");
}
return dbResults;
}

// This function inserts a new row to the DB and returns the last inserted row id
// returns -1 on error
int SQLiteDBInterface::runInsert(std::string query) {
char *zErrMsg = 0;
int rc = sqlite3_exec(database, query.c_str(), NULL, NULL, &zErrMsg);
if (rc != SQLITE_OK) {
db_logger.log("SQL Error: " + string(zErrMsg) + " " + query, "error");
sqlite3_free(zErrMsg);
return -1;
}
db_logger.log("Insert operation done successfully", "info");
vector<vector<pair<string, string>>> dbResults;
string q2 = "SELECT last_insert_rowid();";

int rc2 = sqlite3_exec(database, q2.c_str(), callback, &dbResults, &zErrMsg);

if (rc2 != SQLITE_OK) {
db_logger.log("SQL Error: " + string(zErrMsg) + " " + query, "error");
sqlite3_free(zErrMsg);
return -1;
}
return std::stoi(dbResults[0][0].second);
}

// This function inserts one or more rows of the DB and nothing is returned
// This is used for inserting tables which do not have primary IDs
void SQLiteDBInterface::runInsertNoIDReturn(std::string query) {
char *zErrMsg = 0;
int rc = sqlite3_exec(database, query.c_str(), NULL, NULL, &zErrMsg);
if (rc != SQLITE_OK) {
db_logger.log("SQL Error: " + string(zErrMsg) + " " + query, "error");
sqlite3_free(zErrMsg);
} else {
db_logger.log("Insert operation done successfully: " + query, "info");
}
}

// This function updates one or more rows of the DB
void SQLiteDBInterface::runUpdate(std::string query) {
char *zErrMsg = 0;

int rc = sqlite3_exec(database, query.c_str(), NULL, NULL, &zErrMsg);

if (rc != SQLITE_OK) {
db_logger.log("SQL Error: " + string(zErrMsg) + " " + query, "error");
sqlite3_free(zErrMsg);
} else {
db_logger.log("Update operation done successfully: " + query, "info");
}
}

int SQLiteDBInterface::RunSqlNoCallback(const char *zSql) {
sqlite3_stmt *stmt = NULL;
int rc = sqlite3_prepare_v2(database, zSql, -1, &stmt, NULL);
if (rc != SQLITE_OK) return rc;

int rowCount = 0;
rc = sqlite3_step(stmt);
while (rc != SQLITE_DONE && rc != SQLITE_OK) {
rowCount++;
int colCount = sqlite3_column_count(stmt);
for (int colIndex = 0; colIndex < colCount; colIndex++) {
int type = sqlite3_column_type(stmt, colIndex);
const char *columnName = sqlite3_column_name(stmt, colIndex);
if (type == SQLITE_INTEGER) {
int valInt = sqlite3_column_int(stmt, colIndex);
printf("columnName = %s, Integer val = %d", columnName, valInt);
} else if (type == SQLITE_FLOAT) {
double valDouble = sqlite3_column_double(stmt, colIndex);
printf("columnName = %s,Double val = %f", columnName, valDouble);
} else if (type == SQLITE_TEXT) {
const unsigned char *valChar = sqlite3_column_text(stmt, colIndex);
printf("columnName = %s,Text val = %s", columnName, valChar);
// free((void *) valChar);
} else if (type == SQLITE_BLOB) {
printf("columnName = %s,BLOB", columnName);
} else if (type == SQLITE_NULL) {
printf("columnName = %s,NULL", columnName);
}
}
printf("Line %d, rowCount = %d", rowCount, colCount);

rc = sqlite3_step(stmt);
}

rc = sqlite3_finalize(stmt);

return rc;
}
21 changes: 3 additions & 18 deletions src/metadb/SQLiteDBInterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,28 +19,13 @@ limitations under the License.
#include <map>
#include <string>
#include <vector>
#include "../util/dbinterface/DBInterface.h"

class SQLiteDBInterface {
private:
sqlite3 *database;
std::string databaseLocation;

class SQLiteDBInterface : public DBInterface {
public:
explicit SQLiteDBInterface(std::string databaseLocation);

int init();

int finalize();

std::vector<std::vector<std::pair<std::string, std::string>>> runSelect(std::string);

int runInsert(std::string);

void runUpdate(std::string);

void runInsertNoIDReturn(std::string);

int RunSqlNoCallback(const char *zSql);
int init() override;

SQLiteDBInterface();
};
Expand Down
123 changes: 0 additions & 123 deletions src/performancedb/PerformanceSQLiteDBInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,133 +38,10 @@ int PerformanceSQLiteDBInterface::init() {
return 0;
}

int PerformanceSQLiteDBInterface::finalize() { return sqlite3_close(database); }

PerformanceSQLiteDBInterface::PerformanceSQLiteDBInterface() {
this->databaseLocation = Utils::getJasmineGraphProperty("org.jasminegraph.performance.db.location");
}

PerformanceSQLiteDBInterface::PerformanceSQLiteDBInterface(string databaseLocation) {
this->databaseLocation = databaseLocation;
}

typedef vector<vector<pair<string, string>>> table_type;

static int callback(void *ptr, int argc, char **argv, char **azColName) {
int i;
table_type *dbResults = static_cast<table_type *>(ptr);
vector<pair<string, string>> results;

for (i = 0; i < argc; i++) {
results.push_back(make_pair(azColName[i], argv[i] ? argv[i] : "NULL"));
// printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
dbResults->push_back(results);
return 0;
}

vector<vector<pair<string, string>>> PerformanceSQLiteDBInterface::runSelect(std::string query) {
char *zErrMsg = 0;
int rc;
vector<vector<pair<string, string>>> dbResults;

rc = sqlite3_exec(database, query.c_str(), callback, &dbResults, &zErrMsg);

if (rc != SQLITE_OK) {
perfdb_logger.log("SQL Error: " + string(zErrMsg), "error");
perfdb_logger.error("SQL Error: " + string(zErrMsg));
sqlite3_free(zErrMsg);
} else {
perfdb_logger.info("Operation done successfully");
}
return dbResults;
}

// This function inserts a new row to the DB and returns the last inserted row id
int PerformanceSQLiteDBInterface::runInsert(std::string query) {
char *zErrMsg = 0;
int rc = sqlite3_exec(database, query.c_str(), NULL, NULL, &zErrMsg);
if (rc != SQLITE_OK) {
perfdb_logger.log("SQL Error: " + string(zErrMsg), "error");
sqlite3_free(zErrMsg);
return -1;
}
perfdb_logger.log("Insert operation done successfully", "info");
vector<vector<pair<string, string>>> dbResults;
string q2 = "SELECT last_insert_rowid();";

int rc2 = sqlite3_exec(database, q2.c_str(), callback, &dbResults, &zErrMsg);

if (rc2 != SQLITE_OK) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
return -1;
}
return std::stoi(dbResults[0][0].second);
}

// This function inserts one or more rows of the DB and nothing is returned
// This is used for inserting tables which do not have primary IDs
void PerformanceSQLiteDBInterface::runInsertNoIDReturn(std::string query) {
char *zErrMsg = 0;
int rc = sqlite3_exec(database, query.c_str(), NULL, NULL, &zErrMsg);
if (rc != SQLITE_OK) {
perfdb_logger.log("SQL Error: " + string(zErrMsg), "error");
sqlite3_free(zErrMsg);
} else {
perfdb_logger.log("Insert operation done successfully", "info");
}
}

// This function updates one or more rows of the DB
void PerformanceSQLiteDBInterface::runUpdate(std::string query) {
char *zErrMsg = 0;

int rc = sqlite3_exec(database, query.c_str(), NULL, NULL, &zErrMsg);

if (rc != SQLITE_OK) {
perfdb_logger.log("SQL Error: " + string(zErrMsg), "error");
sqlite3_free(zErrMsg);
} else {
perfdb_logger.log("Update operation done successfully", "info");
}
}

int PerformanceSQLiteDBInterface::RunSqlNoCallback(const char *zSql) {
sqlite3_stmt *stmt = NULL;
int rc = sqlite3_prepare_v2(database, zSql, -1, &stmt, NULL);
if (rc != SQLITE_OK) return rc;

int rowCount = 0;
rc = sqlite3_step(stmt);
while (rc != SQLITE_DONE && rc != SQLITE_OK) {
rowCount++;
int colCount = sqlite3_column_count(stmt);
for (int colIndex = 0; colIndex < colCount; colIndex++) {
int type = sqlite3_column_type(stmt, colIndex);
const char *columnName = sqlite3_column_name(stmt, colIndex);
if (type == SQLITE_INTEGER) {
int valInt = sqlite3_column_int(stmt, colIndex);
printf("columnName = %s, Integer val = %d", columnName, valInt);
} else if (type == SQLITE_FLOAT) {
double valDouble = sqlite3_column_double(stmt, colIndex);
printf("columnName = %s,Double val = %f", columnName, valDouble);
} else if (type == SQLITE_TEXT) {
const unsigned char *valChar = sqlite3_column_text(stmt, colIndex);
printf("columnName = %s,Text val = %s", columnName, valChar);
// free((void *) valChar);
} else if (type == SQLITE_BLOB) {
printf("columnName = %s,BLOB", columnName);
} else if (type == SQLITE_NULL) {
printf("columnName = %s,NULL", columnName);
}
}
printf("Line %d, rowCount = %d", rowCount, colCount);

rc = sqlite3_step(stmt);
}

rc = sqlite3_finalize(stmt);

return rc;
}
21 changes: 3 additions & 18 deletions src/performancedb/PerformanceSQLiteDBInterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,26 +19,11 @@ limitations under the License.
#include <map>
#include <string>
#include <vector>
#include "../util/dbinterface/DBInterface.h"

class PerformanceSQLiteDBInterface {
private:
sqlite3 *database;
std::string databaseLocation;

class PerformanceSQLiteDBInterface : public DBInterface {
public:
int init();

int finalize();

std::vector<std::vector<std::pair<std::string, std::string>>> runSelect(std::string);

int runInsert(std::string);

void runUpdate(std::string);

void runInsertNoIDReturn(std::string);

int RunSqlNoCallback(const char *zSql);
int init() override;

PerformanceSQLiteDBInterface();

Expand Down
Loading

0 comments on commit 331a7f8

Please sign in to comment.