diff --git a/db.cpp b/db.cpp index 0cf4220..af6b890 100644 --- a/db.cpp +++ b/db.cpp @@ -1,143 +1,32 @@ #include "db.h" -#include -#include #include +#include -sqlite3* db = nullptr; - -// --- Connexion / fermeture --- -bool openDB(const std::string& filename) { - int rc = sqlite3_open(filename.c_str(), &db); - if(rc) { - std::cerr << "Impossible d'ouvrir la base : " << sqlite3_errmsg(db) << "\n"; - return false; - } - return true; -} - -void closeDB() { - if(db) sqlite3_close(db); -} - -// --- Authentification --- -int loginUser(const std::string& login, const std::string& password) { - sqlite3_stmt* stmt; - std::string sql = "SELECT id, role FROM users WHERE login=? AND password=?"; - sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, nullptr); - sqlite3_bind_text(stmt, 1, login.c_str(), -1, SQLITE_STATIC); - sqlite3_bind_text(stmt, 2, password.c_str(), -1, SQLITE_STATIC); - - int role = -1; - int rc = sqlite3_step(stmt); - if(rc == SQLITE_ROW) { - role = sqlite3_column_int(stmt, 1); // 0=ADMIN, 1=PROF, 2=STUDENT - } - sqlite3_finalize(stmt); - return role; -} - -// --- Étudiants --- -std::vector getAllStudents() { - std::vector list; - sqlite3_stmt* stmt; - std::string sql = "SELECT s.id, s.nom, n.note1, n.note2, n.note3 FROM students s JOIN notes n ON s.id=n.student_id"; - sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, nullptr); - - while(sqlite3_step(stmt) == SQLITE_ROW) { - Student s; - s.id = sqlite3_column_int(stmt, 0); - s.nom = reinterpret_cast(sqlite3_column_text(stmt, 1)); - s.notes[0] = sqlite3_column_int(stmt, 2); - s.notes[1] = sqlite3_column_int(stmt, 3); - s.notes[2] = sqlite3_column_int(stmt, 4); - list.push_back(s); - } - sqlite3_finalize(stmt); - return list; -} - -Student getStudentByLogin(const std::string& login) { - Student s; - sqlite3_stmt* stmt; - std::string sql = "SELECT s.id, s.nom, n.note1, n.note2, n.note3 FROM students s JOIN notes n ON s.id=n.student_id WHERE s.nom=?"; - sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, nullptr); - sqlite3_bind_text(stmt, 1, login.c_str(), -1, SQLITE_STATIC); - - if(sqlite3_step(stmt) == SQLITE_ROW){ - s.id = sqlite3_column_int(stmt, 0); - s.nom = reinterpret_cast(sqlite3_column_text(stmt, 1)); - s.notes[0] = sqlite3_column_int(stmt, 2); - s.notes[1] = sqlite3_column_int(stmt, 3); - s.notes[2] = sqlite3_column_int(stmt, 4); - } - sqlite3_finalize(stmt); - return s; -} - -// --- Modifier une note --- -bool updateNote(int studentId, int noteIndex, int newNote) { - std::string col = "note" + std::to_string(noteIndex+1); - std::string sql = "UPDATE notes SET " + col + "=? WHERE student_id=?"; - sqlite3_stmt* stmt; - sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, nullptr); - sqlite3_bind_int(stmt, 1, newNote); - sqlite3_bind_int(stmt, 2, studentId); - - int rc = sqlite3_step(stmt); - sqlite3_finalize(stmt); - return rc == SQLITE_DONE; -} - -// --- Export / Import --- -bool exportData(const std::string& filename, const std::string& role, const std::string& login) { +bool exportData(const std::string& filename, const std::vector& students) { std::ofstream file(filename); if(!file.is_open()) return false; - std::vector list; - if(role == "ADMIN" || role == "PROF") list = getAllStudents(); - else list.push_back(getStudentByLogin(login)); - - for(auto& s : list){ + for(auto& s : students){ file << s.nom << " " << s.notes[0] << " " << s.notes[1] << " " << s.notes[2] << "\n"; } file.close(); return true; } -bool importData(const std::string& filename, const std::string& role) { - if(role == "STUDENT") return false; // pas autorisé - +bool importData(const std::string& filename, std::vector& students) { std::ifstream file(filename); if(!file.is_open()) return false; std::string nom; int n1,n2,n3; - while(file >> nom >> n1 >> n2 >> n3){ - if(role == "ADMIN"){ - // chercher étudiant - sqlite3_stmt* stmt; - std::string sql = "UPDATE notes SET note1=?, note2=?, note3=? WHERE student_id=(SELECT id FROM students WHERE nom=?)"; - sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, nullptr); - sqlite3_bind_int(stmt, 1, n1); - sqlite3_bind_int(stmt, 2, n2); - sqlite3_bind_int(stmt, 3, n3); - sqlite3_bind_text(stmt, 4, nom.c_str(), -1, SQLITE_STATIC); - sqlite3_step(stmt); - sqlite3_finalize(stmt); - } else if(role == "PROF"){ - // modification notes seulement - sqlite3_stmt* stmt; - std::string sql = "UPDATE notes SET note1=?, note2=?, note3=? WHERE student_id=(SELECT id FROM students WHERE nom=?)"; - sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, nullptr); - sqlite3_bind_int(stmt, 1, n1); - sqlite3_bind_int(stmt, 2, n2); - sqlite3_bind_int(stmt, 3, n3); - sqlite3_bind_text(stmt, 4, nom.c_str(), -1, SQLITE_STATIC); - sqlite3_step(stmt); - sqlite3_finalize(stmt); - } + int i = 0; + while(file >> nom >> n1 >> n2 >> n3 && i < students.size()){ + students[i].nom = nom; + students[i].notes[0] = n1; + students[i].notes[1] = n2; + students[i].notes[2] = n3; + i++; } - file.close(); return true; } \ No newline at end of file