Superviseur - Collecteur 1.0
Ce logiciel correspond au collecteur de la suite des trois logiciels composant le superviseur
|
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