1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
| #include "database.h"
#include "gui/thread.h"
#include "gui/mainwindow.h"
Database *t_instance0 = 0; // use in main thread
Database *t_instance1 = 0; // use in first thread
Database *t_instance2 = 0; // use in cards
sqlite3 *Database::db;
bool Database::is_open = false;
bool Database::is_opening = false;
Database* Database::instance(int database_number)
{
if(database_number == 0)
{
if(t_instance0 == NULL)
t_instance0 = new Database(0);
return t_instance0;
}
else if(database_number == 1)
{
if(t_instance1 == NULL)
t_instance1 = new Database(1);
return t_instance1;
}
else if(database_number == 2)
{
if(t_instance2 == NULL)
t_instance2 = new Database(2);
return t_instance2;
}
return NULL;
}
Database::Database(int database_number)
{
is_open = false;
this->database_number = database_number;
if(is_open == false && is_opening == false)
initialize(DATABASE);
}
int Database::callback(void *a_param, int number_value, char ** value, char ** name_column)
{
for (int i = 0; i < number_value; i++)
{
if(value[i])
{
Database::instance((int)a_param)->result_request.push_back(value[i]);
}
else
{
Database::instance((int)a_param)->result_request.push_back("NULL");
}
}
return 0;
}
void Database::delete_all()
{
if(write("DROP TABLE combos") && write("DROP TABLE states"))
{
if(database_number == 0)
MainWindow::instance()->write("DATABASE ALL DELETE","information");
else
Thread::instance()->write("DATABASE ALL DELETE","information");
}
}
void Database::initialize(string file)
{
if(sqlite3_open(file.c_str(), &db) != 0)
{
if(database_number == 0)
MainWindow::instance()->write("Could not open data base","information");
else
Thread::instance()->write("Could not open data base","information");
}
else
{
is_opening = true;
if(database_number == 0)
{
write("CREATE TABLE combos(id INTEGER PRIMARY KEY, combo VARCHAR(127) UNIQUE)");
write("CREATE TABLE states(id INTEGER PRIMARY KEY, id_combo INTEGER, score INTEGER, date_added DATETIME, FOREIGN KEY (id_combo) REFERENCES combos(id))");
write("CREATE TABLE neural_networks(id INTEGER, id_combo INTEGER, clustering_rate REAL, number_input INTEGER, number_hidden_layer INTEGER, number_neuron_layer INTEGER"
"FOREIGN KEY (id_combo) REFERENCES combos(id), PRIMARY KEY (id, id_combo))");
write("CREATE TABLE perceptrons(id INTEGER, id_layer INTEGER, id_nn INTEGER, id_combo INTERGER, weights VARCHAR(255), bias REAL, number_input INTEGER, learning_rate INTEGER, "
"FOREIGN KEY (id_nn) REFERENCES neural_networks(id), FOREIGN KEY (id_combo) REFERENCES combos(id), PRIMARY KEY (id, id_layer, id_nn, id_combo))");
write("ALTER TABLE neural_networks ADD COLUMN positive_classifed_well INTEGER");
write("ALTER TABLE neural_networks ADD COLUMN positive_misclassified INTEGER");
write("ALTER TABLE neural_networks ADD COLUMN negative_classified_well INTEGER");
write("ALTER TABLE neural_networks ADD COLUMN negative_misclassified INTEGER");
write("ALTER TABLE states ADD COLUMN random REAL");
}
if(database_number == 0)
MainWindow::instance()->write((string)"Opened database " + to_string(database_number),"information");
else
Thread::instance()->write((string)"Opened database " + to_string(database_number),"information");
is_open = true;
}
}
bool Database::write(string sql)
{
char *error = "database is not open";
if(sqlite3_exec(db, sql.c_str(), callback, (void*)this->database_number, &error) != (SQLITE_OK || SQLITE_CONSTRAINT_UNIQUE))//can used callback function
{
if(database_number == 0)
MainWindow::instance()->write("Request execute with success", "current_information");
else
Thread::instance()->write("Request execute with success", "current_information");
return true;
}
else
{
if(database_number == 0)
MainWindow::instance()->write((string)"Error : " + error, "information");
else
Thread::instance()->write((string)"Error : " + error, "information");
return false;
}
}
bool Database::read(string sql)
{
this->result_request.clear();
return write(sql);
} |
Partager