Superviseur - Collecteur 1.0
Ce logiciel correspond au collecteur de la suite des trois logiciels composant le superviseur
gestionbdd.cpp
Aller à la documentation de ce fichier.
00001 #include "gestionbdd.h"
00002 
00003 
00005 
00009 GestionBDD::GestionBDD(QObject *parent) :
00010     QObject(parent)
00011 {
00012     this->bdd = QSqlDatabase::addDatabase("QSQLITE", NOM_BDD);
00013     //this->bdd.setDatabaseName(QString(NOM_BDD)+QString(".db"));
00014     this->bdd.setDatabaseName(":memory:");
00015 
00016     if(!this->bdd.open()){
00017         qDebug() << tr("Connexion à la base de données impossible: %1").arg(this->bdd.lastError().text()); //addToLog(Error, Database, tr("Connexion à la base de données impossible"));
00018         return;
00019     }
00020     creerBDD();
00021 
00022     qDebug() << tr("Le driver courant (%1) : ").arg(this->bdd.driverName());
00023     if(this->bdd.driver()->hasFeature(QSqlDriver::Transactions)) qDebug()             << "  " + tr("SUPPORTE les transactions.");
00024     if(this->bdd.driver()->hasFeature(QSqlDriver::PreparedQueries)) qDebug()          << "  " + tr("SUPPORTE les requêtes préparées.");
00025     if(this->bdd.driver()->hasFeature(QSqlDriver::NamedPlaceholders)) qDebug()        << "  " + tr("SUPPORTE les marques nommées.");
00026     if(this->bdd.driver()->hasFeature(QSqlDriver::PositionalPlaceholders)) qDebug()   << "  " + tr("SUPPORTE les marques ordrées.");
00027     if(this->bdd.driver()->hasFeature(QSqlDriver::QSqlDriver::LastInsertId)) qDebug() << "  " + tr("SUPPORTE le renvoi de l'ID de la dernière ligne insérée.");
00028 
00029     connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(sauvegarderBDD()));
00030 
00031     QTimer::singleShot(3600000, this, SLOT(sauvegarderBDD()));
00032 }
00033 
00034 
00036 
00039 GestionBDD::~GestionBDD(){
00040     {
00041         if(this->bdd.isOpen()) this->bdd.close();
00042     }
00043     QSqlDatabase::removeDatabase(NOM_BDD);
00044 }
00045 
00046 
00048 
00053 void GestionBDD::ajouterDonnees(QString donnees){
00054     QJson::Parser parser;
00055     bool ok;
00056 
00057     QVariantMap donneesP = parser.parse(donnees.toAscii(), &ok).toMap();
00058     if(!ok){
00059       qDebug() << tr("Une erreur est survenue dans le parsing de la chaine JSON.");
00060       return;
00061     }
00062     QList<QVariant> donneesVMsP = donneesP.value("vms").toList();
00063 
00064     QStringList listeColonnes;
00065     QList<QVariantMap> liste;
00066 
00067     if(!this->bdd.isOpen()){
00068         if(!this->bdd.open()) qDebug() << tr("Connexion à la base de données impossible");
00069     }
00070     if(!this->bdd.transaction()) qDebug() << tr("Impossible de démarrer la transaction.");
00071 
00072     liste.append(donneesP);
00073     listeColonnes << "name" << "time" << "cputemp" << "mbtemp" << "cpu" << "ram" << "disk" << "network";
00074     QVariant id = executerRequete("INSERT INTO InfosHyperviseurs(%1) VALUES(%2)", listeColonnes, liste);
00075 
00076     listeColonnes.clear();
00077     liste.clear();
00078 
00079     /*QSqlQuery requete = this->bdd.exec("SELECT last_insert_rowid()");
00080     requete.next();
00081     qDebug() << requete.value(0);
00082     QSqlQuery requete(this->bdd);
00083     qDebug() << requete.lastInsertId();*/
00084 
00085     QListIterator<QVariant> li(donneesVMsP);
00086     while(li.hasNext()) liste.append(li.next().toMap());
00087     listeColonnes << "name" << "uuid" << "state" << "cpu" << "ram" << "maxram" << "network";
00088     executerRequete("INSERT INTO InfosVMs(idinfos,%1) VALUES("+id.toString()+",%2)", listeColonnes, liste);
00089 
00090     if(!this->bdd.commit()){
00091         qDebug() << tr("Impossible de valider la transaction: %1").arg(this->bdd.lastError().text());
00092     }
00093 
00094 }
00095 
00097 
00116 QVariant GestionBDD::executerRequete(QString reqStr, QStringList listeColonnes, QList<QVariantMap> liste){
00117     if(reqStr.isEmpty() || listeColonnes.isEmpty() || liste.isEmpty()){
00118         qDebug() << tr("Erreur. Un paramètre ne contient aucunes données.");
00119         qDebug() << listeColonnes;
00120         return QVariant(false);
00121     }
00122 
00123     if(!this->bdd.isOpen()){
00124         if(!this->bdd.open()) qDebug() << tr("Connexion à la base de données impossible");
00125     }
00126     QSqlQuery requete(this->bdd);
00127 
00128     QString colonnes;
00129     QString placeholders;
00130 
00131     QStringListIterator i(listeColonnes);
00132     while(i.hasNext()){
00133         QString item = i.next();
00134         if(liste.first().contains(item)){
00135             colonnes += " "+item+",";
00136             placeholders += " :"+item+",";
00137         }
00138     }
00139     colonnes = colonnes.left(colonnes.size()-1);
00140     placeholders = placeholders.left(placeholders.size()-1);
00141 
00142     requete.prepare(reqStr.arg(colonnes).arg(placeholders));
00143 
00144     QListIterator<QVariantMap> li(liste);
00145     while(li.hasNext()){
00146         QVariantMap VMdata = li.next();
00147         i.toFront();
00148         while(i.hasNext()){
00149             QString item = i.next();
00150             if(VMdata.contains(item)){
00151                 requete.bindValue(":"+item, VMdata[item]);
00152             }
00153         }
00154         requete.exec();
00155         verifierErreur(requete);
00156     }
00157 
00158     return requete.lastInsertId();
00159 }
00160 
00161 
00163 
00167 void GestionBDD::creerBDD(){
00168     if(!this->bdd.isOpen()){
00169         if(!this->bdd.open()) qDebug() << tr("Connexion à la base de données impossible");
00170     }
00171 
00172     QSqlQuery requete(this->bdd);
00173 
00174     requete.exec("PRAGMA foreign_keys = ON;");
00175     verifierErreur(requete);
00176 
00177     requete.exec(
00178         "CREATE TABLE IF NOT EXISTS InfosHyperviseurs ("
00179             "id        INTEGER, "
00180             "name      VARCHAR(500)  NOT NULL, "
00181             "time      INTEGER       NOT NULL, "
00182             "cputemp   FLOAT, "
00183             "mbtemp    FLOAT, "
00184             "cpu       FLOAT, "
00185             "ram       FLOAT, "
00186             "disk      FLOAT, "
00187             "network   FLOAT, "
00188         "PRIMARY KEY(id))"
00189     );
00190     verifierErreur(requete);
00191 
00192     requete.exec(
00193         "CREATE TABLE IF NOT EXISTS InfosVMs ("
00194             "id       INTEGER, "
00195             "idinfos  INTEGER        NOT NULL, "
00196             "name     VARCHAR(500)   NOT NULL, "
00197             "uuid     VARCHAR(50), "
00198             "state    SMALLINT, "
00199             "cpu      FLOAT, "
00200             "ram      INTEGER, "
00201             "maxram   INTEGER, "
00202             "network  FLOAT, "
00203         "PRIMARY KEY(id), "
00204         "FOREIGN KEY(idinfos) REFERENCES InfosHyperviseurs(id) ON DELETE CASCADE)"
00205     );
00206     verifierErreur(requete);
00207 
00208     requete.exec("CREATE INDEX IF NOT EXISTS InfosName  ON InfosHyperviseurs(name)");
00209     verifierErreur(requete);
00210     requete.exec("CREATE INDEX IF NOT EXISTS InfosTime  ON InfosHyperviseurs(time)");
00211     verifierErreur(requete);
00212     requete.exec("CREATE INDEX IF NOT EXISTS VMsIdinfos ON InfosVMs(idinfos)");
00213     verifierErreur(requete);
00214     requete.exec("CREATE INDEX IF NOT EXISTS VMsName    ON InfosVMs(name)");
00215     verifierErreur(requete);
00216 
00217 }
00218 
00219 
00221 
00225 void GestionBDD::sauvegarderBDD(){
00226     if(!this->bdd.isOpen()){
00227         if(!this->bdd.open()) qDebug() << tr("Connexion à la base de données impossible");
00228     }
00229     {
00230         QSqlDatabase sauvegarde = QSqlDatabase::addDatabase("QSQLITE", QString(NOM_BDD)+QString("_sauvegarde"));
00231         sauvegarde.setDatabaseName(QString(NOM_BDD)+QDateTime::currentDateTime().toString("dd-MM-yyyy_hh-mm-ss")+QString(".db"));
00232         if(!sauvegarde.isOpen()){
00233             if(!sauvegarde.open()) qDebug() << tr("Connexion à la base de données impossible");
00234         }
00235 
00236         // Optimisations
00237         sauvegarde.exec("PRAGMA foreign_keys = ON;");
00238         sauvegarde.exec("PRAGMA case_sensitive_like=true;");
00239         sauvegarde.exec("PRAGMA journal_mode=MEMORY;");
00240         sauvegarde.exec("PRAGMA temp_store=MEMORY;");
00241         sauvegarde.exec("PRAGMA locking_mode=EXCLUSIVE;");
00242         sauvegarde.exec("PRAGMA synchronous = OFF;");
00243 
00244         // Copie des tables
00245         QStringList listeTables;
00246         QSqlQuery requete = this->bdd.exec("SELECT sql, tbl_name FROM sqlite_master WHERE type='table' AND sql NOT NULL and name NOT IN ('sqlite_stat1', 'sqlite_sequence')");
00247         verifierErreur(requete);
00248         while(requete.next()){
00249             verifierErreur(sauvegarde.exec(requete.value(0).toString()));
00250             listeTables << requete.value(1).toString();
00251         }
00252 
00253         // Copie des indexes
00254         requete = this->bdd.exec("SELECT sql FROM sqlite_master WHERE type='index' AND sql NOT NULL and name NOT IN ('sqlite_stat1', 'sqlite_sequence')");
00255         verifierErreur(requete);
00256         while(requete.next()){
00257             verifierErreur(sauvegarde.exec(requete.value(0).toString()));
00258         }
00259 
00260         sauvegarde.close();
00261 
00262         requete = this->bdd.exec("ATTACH DATABASE '" + sauvegarde.databaseName() + "' as sauvegarde");
00263         verifierErreur(requete);
00264 
00265         if(!this->bdd.transaction()) qDebug() << tr("Impossible de démarrer la transaction.");
00266 
00267         int i;
00268         for(i=0; i < listeTables.count(); i++){
00269             verifierErreur(this->bdd.exec("INSERT INTO sauvegarde."+listeTables.at(i)+" SELECT * FROM main."+listeTables.at(i)));
00270         }
00271         for(i=0; i < listeTables.count(); i++){
00272             verifierErreur(this->bdd.exec("DELETE FROM main."+listeTables.at(i)));
00273         }
00274 
00275         if(!this->bdd.commit()) qDebug() << tr("Impossible de valider la transaction: %1").arg(this->bdd.lastError().text());
00276 
00277         requete = this->bdd.exec("DETACH DATABASE sauvegarde");
00278         verifierErreur(requete);
00279     }
00280     QSqlDatabase::removeDatabase(QString(NOM_BDD)+QString("_sauvegarde"));
00281 
00282     QTimer::singleShot(3600000, this, SLOT(sauvegarderBDD()));
00283 }
00284 
00285 
00287 
00293 bool GestionBDD::verifierErreur(QSqlQuery requete){
00294     QSqlError erreur      = requete.lastError();
00295     QString   requetePrec = requete.lastQuery();
00296 
00297     QMapIterator<QString, QVariant> i(requete.boundValues());
00298     while(i.hasNext()){
00299         i.next();
00300         requetePrec.replace(i.key(), i.value().toString());
00301     }
00302 
00303     if(erreur.type() != QSqlError::NoError){
00304         qDebug() << tr("%1 : %2").arg(erreur.text()).arg(requetePrec);
00305         return true;
00306     }
00307     return false;
00308 }
00309 
00310 
 Tout Classes Fichiers Fonctions Variables Macros