180 lines
7.7 KiB
C++
180 lines
7.7 KiB
C++
#include "bdd.h"
|
|
|
|
|
|
#include <QDebug>
|
|
#include <QSqlRecord>
|
|
#include <QSqlQuery>
|
|
//#include <QDateTime>
|
|
#include <QCryptographicHash>
|
|
|
|
|
|
//============================================================================
|
|
// Création du modèle
|
|
//============================================================================
|
|
Bdd::Bdd() :
|
|
QObject() {
|
|
|
|
m_lignes.clear();
|
|
m_ptr_ligne = 0;
|
|
}
|
|
|
|
//================================================================================================================================
|
|
// Fonction : Lit dans TB_Systeme l'état de 'Etat_cm3p' et le retourne.
|
|
// Reçoit : Rien
|
|
// Retour : 0=En cours d'initialisation, 1=Démarré Ok ou -1=Démarrage impossible
|
|
//================================================================================================================================
|
|
qint16 Bdd::check_fin_configuration()
|
|
{
|
|
QSqlQuery query;
|
|
bool retour;
|
|
|
|
retour = false;
|
|
|
|
if (query.exec("SELECT Valeur FROM TB_Systeme WHERE Nom='Etat_cm3p' ")) // Exécution de la requête (sans erreur)
|
|
{
|
|
if (query.next()) // Cas normal où on a trouvé une valeur :
|
|
{
|
|
retour = query.record().value(0).toInt();
|
|
}
|
|
else qDebug() << "La requête n'a renvoyé aucune valeur...";
|
|
}
|
|
else qDebug() << "/!\\ Erreur d'exécution de la requête !";
|
|
|
|
return(retour);
|
|
}
|
|
|
|
|
|
//================================================================================================================================
|
|
// Fonction : Exécute la requête SQL reçue en paramètre puis va récupérer les résultats. Seule le premier enregistrement est
|
|
// retourné car je ne sais pas renvoyer un vecteur de StringList (seul les vecteurs de String fonctionnent côté QML).
|
|
// Juste avant le retour, on appelle la fonction de mise à jour du modèle. Cela permet de s'assurer que toutes les
|
|
// valeurs utilisées dans QML sont à jour immédiatement (utile notamment après un UPDATE).
|
|
// Reçoit : la requête à exécuter
|
|
// Retour : un tableau de String avec autant d'entrées que de colonnes renvoyées par MariaDB. (Important : si elle renvoit
|
|
// plus d'une ligne, seule la première est retournée)
|
|
//================================================================================================================================
|
|
QStringList Bdd::requete_unique(QString requete)
|
|
{
|
|
int i;
|
|
|
|
QStringList resultats;
|
|
QSqlQuery query(requete);
|
|
while (query.next())
|
|
{
|
|
QSqlRecord resultat = query.record();
|
|
|
|
for(i = 0; i < resultat.count(); i++)
|
|
{
|
|
resultats << resultat.value(i).toString();
|
|
}
|
|
|
|
break; // On ne renvoie que le premier enregistrement quoi qu'il arrive
|
|
}
|
|
|
|
return(resultats);
|
|
}
|
|
|
|
|
|
//================================================================================================================================
|
|
// Fonction : Exécute la requête SQL reçue en paramètre puis va récupérer les résultats. Les résultats sont stockés dans la
|
|
// variable 'm_lignes' et la fonction renvoit soit -1 si erreur, soit le nombre d'enregistrements récupérés dans la BDD.
|
|
// Reçoit : la requête à exécuter
|
|
// Retour : -1 si erreur, n>=0 sinon (n = nombre de lignes récupérés dans la BDD par la requête)
|
|
//================================================================================================================================
|
|
qint64 Bdd::requete(QString requete)
|
|
{
|
|
QSqlQuery query;
|
|
QStringList ligne; // Ligne temporaire
|
|
qint64 nb_lignes = 0; // Nombre de lignes en retour de requête
|
|
qint16 nb_champs; // Nombre de champs de la ligne
|
|
qint16 i;
|
|
|
|
//QTime myTimer;
|
|
//myTimer.start();
|
|
|
|
m_lignes.clear(); // RAZ de la liste
|
|
m_ptr_ligne = 0; // RAZ du pointeur sur la liste
|
|
|
|
//qDebug() << "REQUETE : Temps écoulé avant exec : " << myTimer.elapsed() << "ms";
|
|
|
|
query.setForwardOnly(true); // Permet d'améliorer l'efficacité (mais oblige ensuite à accéder dans l'ordre aux enregistrements)
|
|
if (!query.exec(requete)) return(-1); // Exécution de la requête
|
|
|
|
//qDebug() << "REQUETE : Temps écoulé après exec : " << myTimer.elapsed() << "ms";
|
|
|
|
while (query.next()) // Boucle sur tous les enregistrements
|
|
{
|
|
QSqlRecord resultat = query.record(); // Récupération de enregistrement
|
|
nb_champs = resultat.count(); // Récupération du nombre de champs
|
|
//ligne = QStringList(); // Ligne vide
|
|
ligne.clear();
|
|
|
|
for(i = 0; i < nb_champs; i++) // Boucle sur tous les champs
|
|
{
|
|
ligne << query.value(i).toString(); // Chargement du champs dans la ligne temporaire ('query.value' est réputé plus rapide que 'record.value'
|
|
}
|
|
|
|
m_lignes << ligne; // Stockage de la ligne temporaire dans la liste de lignes
|
|
nb_lignes ++; // Maj du nombre de lignes
|
|
}
|
|
|
|
//qDebug() << "REQUETE : Temps écoulé après chargement lignes : " << myTimer.elapsed() << "ms";
|
|
//qDebug() << "Taille de 'm_lignes' = " hash.toHex()<< m_lignes.count();
|
|
|
|
return(nb_lignes);
|
|
}
|
|
|
|
//================================================================================================================================
|
|
// Fonction : Lit la ligne suivante dans la liste 'm_lignes'
|
|
// Reçoit : Rien
|
|
// Retour : un tableau de String avec autant d'entrées que de colonnes renvoyées par MariaDB.
|
|
//================================================================================================================================
|
|
QStringList Bdd::lecture_ligne()
|
|
{
|
|
QStringList ligne = QStringList(); // Ligne temporaire
|
|
|
|
|
|
ligne = m_lignes.at(m_ptr_ligne);
|
|
m_ptr_ligne ++; // Maj du pointeur sur la liste
|
|
|
|
|
|
return(ligne);
|
|
}
|
|
|
|
|
|
//================================================================================================================================
|
|
// Fonction : Calcule le hash de la chaine reçue en entrée et le retourne
|
|
// Reçoit : La chaine à hacher
|
|
// Retour : La chaine hachée
|
|
//================================================================================================================================
|
|
QString Bdd::sha256(QString entree)
|
|
{
|
|
QByteArray hash = QCryptographicHash::hash(entree.toUtf8(), QCryptographicHash::Sha256);
|
|
return(hash.toHex());
|
|
}
|
|
|
|
|
|
//================================================================================================================================
|
|
// Fonction : Convertit un entier signé sur 16 bits en une chaine de 4 caractères hexa
|
|
// Reçoit : La valeur à convertir
|
|
// Retour : La chaine en hexa
|
|
//================================================================================================================================
|
|
QString Bdd::int16_to_chaine_hexa(qint16 entree)
|
|
{
|
|
char chaine[20] = "";
|
|
char retour[5] = "";
|
|
uint16_t lg;
|
|
|
|
sprintf(chaine, "%04X", (int16_t) entree);
|
|
|
|
lg = strlen(chaine);
|
|
if (lg > 4) sprintf(retour, "%s", (chaine + lg - 4)); // Nécessaire pour les valeurs négatives qui renvoient FFFF avant. Par exemple : 'FFFFFEC8' au lieu de 'FEC8'
|
|
else sprintf(retour, "%s", chaine); // Cas normal de chaines déjà sur 4 octets
|
|
|
|
//qDebug() << "Chaine = " << chaine << " et Retour = [" << retour << "] et longueur = " << strlen(retour) ;
|
|
return(retour);
|
|
}
|
|
|
|
|
|
|