IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

( C++ sous Kate / Opensuse ) -> Connexion sqlite3 : Callback


Sujet :

Linux

  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2009
    Messages : 186
    Points : 206
    Points
    206
    Par défaut ( C++ sous Kate / Opensuse ) -> Connexion sqlite3 : Callback
    Bonjour à tous !

    Je vous explique mon souci. J'ai a faire communiquer un peripherique par liaison RS232. Je dois l'interroger en liaison modbus (Protocole RTU), puis stocker ce qu'il me retourne dans un base de donnée SQLITE3.

    J'ai donc un petit programme qui gere une connexion a une BDD que voici.

    Mon main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include <iostream>
    #include <sqlite3.h>
     
    #include "tRs232.h"
    #include "Sauv&restore.h"
     
    using namespace std;
     
    #define DBNAME "energie_linux.sqlite3"
     
    int callback(void *NotUsed, int argc, char **argv, char **azColName)
    {
    	cout << "debut";
    	for(int i=0; i<argc; i++)
    	{
    		// Affichage des resultats des requetes
    		printf("%s = %s", azColName[i], argv[i] ? argv[i] : "NULL" );
    	}
     
    	cout <<"fin"<< endl;
    	return 0;
    }
     
    int main(int argc, char *argv[])
    {
    	sqlite3 *db;
    	int choix;
     
    	//Connexion
    	cout << endl << "Connexion à la base de données en cours ..." <<endl;
    	bddconnect(db);
     
    	cout << endl <<"Menu :" << endl << endl;
    	cout << "Sauvegarder la configuration ---------------- 1" << endl;
    	cout << "Restaurer les parametres de la passerelle --- 2" << endl;
    	cout << "Quitter ------------------------------------- 3" << endl;
    	cout << endl << "Choix ??? >> ";
     
     
    		cin >> choix;
    		cout << endl;
     
    		if (choix == 1)
    		{
    			// Sauvegarde de la configuration
    			querysave(db);
    		}
     
    		if (choix == 2)
    		{
    			// Restauration des parametres
    			queryrestore(db);
    		}
     
    		if (choix == 3)
    		{
    			// Deconnexion
    			cout << "Deconnexion ..." << endl;
    			bdddisconnect(db);
    			// Quitter
    			return EXIT_SUCCESS;
    		}
     
     
    }
    Mon deuxieme fichier, ou il y a les declarations des prototypes de fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifndef SAUVREST_H
    #define SAUVREST_H
    // ---------------- PROTOTYPES DES FONCTIONS ----------------------
    #include <sqlite3.h>
    #include <errno.h>
     
    int bddconnect(sqlite3 *bdd);
    int callback(void *NotUsed, int argc, char **argv, char **azColName);
    int querysave(sqlite3 *mabase);
    int queryrestore(sqlite3 *mabase);
    int bdddisconnect(sqlite3 *bdd);
     
    #endif
    Et enfin mes fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include <iostream>
    #include <errno.h>
    #include <sqlite3.h>
    #include "Sauv&restore.h"
     
    using namespace std;
    #undef DBNAME
    #define DBNAME "energie_linux.sqlite3"
     
    // ------------------------- CONNEXION A LA BASE DE DONNEE ---------------------------
     
    int bddconnect(sqlite3 *bdd)
    {
    	if(sqlite3_open(DBNAME,&bdd) != SQLITE_OK) 
    	{
    		sqlite3_close(bdd);
    		cerr << "erreur connexion !!" << endl;
    		return -1;
    	}
     
    	cout << "connexion réussie !" <<endl;
    	return 0;
    }
     
    // ------------------------------ DECONNEXION DE LA BASE DE DONNEE ---------------------------
     
    int bdddisconnect(sqlite3 *bdd)
    {
    	sqlite3_close(bdd);
    	cout << "Deconnexion réussie ! Au revoir !" << endl;
    	return 0;
    }
     
    // ---------------- SAUVEGARDE DES CONFIGS ------------------
     
    int querysave(sqlite3 *mabase)
    {
    	char *errormsg;
    	int rc = sqlite3_exec(mabase, "SELECT mesure FROM energieP", callback, 0, &errormsg);
    	if (rc != SQLITE_OK)
    	{
    		cerr << "SQL error: " << errormsg << endl;
    		sqlite3_free(errormsg);
    		return -1;
    	}
    	return 0;
    }
     
    // ---------------- RESTAURATION DES CONFIGS ------------------
     
    int queryrestore(sqlite3 *mabase)
    {
    	char* errormsg;
    	if (sqlite3_exec(mabase, "SELECT mesure FROM energieQ", callback, 0, &errormsg) != SQLITE_OK)
    	{
    		cerr <<"SQL error : " << errormsg << endl;
    		sqlite3_free(errormsg);
    		return -1;
    	}
    	return 0;
    }
    Remarque : Ne vous inquietez pas, je consulte des données avec les requetes ici présentes, je n'enregistre rien... alors que je devrais le faire pourtant, j'aviserai une fois mon probleme resolu pour enregistrer dans la base de donnée

    La compilation se passe sans aucun probleme. J'arrive a me connecter à la BDD et à me deconnecter parfaitement, mais lors de l'execution d'une requete, j'ai une erreur de segmentation. Cela viens certainement du callback.
    De plus, je souhaiterai bouger le callback dans l'autre fichier, ou je declare toutes mes fonctions, pour pouvoir par la suite compiler ces fichiers avec mes classes de communication modbus et mes classes de construction de trames.

    Si quelqu'un a une idée, qu'il ou elle me fasse signe !
    Merci d'avoir pris le temps de lire ceci =)

  2. #2
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2009
    Messages : 186
    Points : 206
    Points
    206
    Par défaut
    Probleme resolu !

    Voici le nouveau code !

    Mon main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include <stdio.h>
    #include <unistd.h>
    #include "sqlite3.h"
    #include <iostream>
    using namespace std;
    #include "Sauv&restore_nic.h"
    #define DBNAME	"energie_linux.sqlite3"
     
     
    int main(int argc, char **argv)
    {
     
    char* zErrMsg;
    sqlite3* db;
     
     
    // Connexion a la bdd
    int rc = sqlite3_open(DBNAME, &db);
     
    	if( rc )
    	{
    		// Si ouverture echouée, on affiche message d'erreur
    		fprintf(stderr, "Impossible d'ouvrir la base de données: %s\n", sqlite3_errmsg(db));
    		sqlite3_close(db);
    		return(1);
    	}
     
    	else
    		cout << "Ouverture de la base "<< DBNAME << " reussie !"<<endl;
     
    	querysave(db);
    	queryrestore(db);
     
    	// Fermeture de la bdd
    	sqlite3_close(db);
    }
    Mes prototypes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #ifndef SAUVREST_H
    #define SAUVREST_H
    // ---------------- PROTOTYPES DES FONCTIONS ----------------------
    #include "sqlite3.h"
    #include <errno.h>
     
     
    	int bddconnect(sqlite3 *bdd);
    	int callback(void *NotUsed, int argc, char **argv, char **azColName);
    	int querysave(sqlite3 *mabase);
    	int queryrestore(sqlite3 *mabase);
    	int bdddisconnect(sqlite3 *bdd);
     
    #endif
    Mes fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include <iostream>
    #include <errno.h>
    #include "sqlite3.h"
    #include "Sauv&restore_nic.h"
     
    using namespace std;
    #undef DBNAME
    #define DBNAME "energie_linux.sqlite3"
     
    int callback(void *NotUsed, int argc, char **argv, char **azColName)
    {
    	int i =0;
    	for(i=0; i<argc; i++)
    	{
    		printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    	}
    	printf("\n");
    	return 0;
    }
     
    // ------------------------- CONNEXION A LA BASE DE DONNEE ---------------------------
     
    int bddconnect(sqlite3 *bdd)
    {
    	if(sqlite3_open(DBNAME,&bdd) != SQLITE_OK) 
    	{
    		sqlite3_close(bdd);
    		cerr << "erreur connexion !!" << endl;
    		return -1;
    	}
     
    	cout << "connexion réussie !" <<endl;
    	return 0;
    }
     
    // ------------------------------ DECONNEXION DE LA BASE DE DONNEE ---------------------------
     
    int bdddisconnect(sqlite3 *bdd)
    {
    	sqlite3_close(bdd);
    	cout << "Deconnexion réussie ! Au revoir !" << endl;
    	return 0;
    }
     
    // ---------------- SAUVEGARDE DES CONFIGS ------------------
     
    int querysave(sqlite3 *mabase)
    {
    	char *errormsg;
    	int rc = sqlite3_exec(mabase, "SELECT mesure FROM energieP", callback, 0, &errormsg);
    	if (rc != SQLITE_OK)
    	{
    		cerr << "SQL error: " << errormsg << endl;
    		sqlite3_free(errormsg);
    		return -1;
    	}
    	return 0;
    }
     
    // ---------------- RESTAURATION DES CONFIGS ------------------
     
    int queryrestore(sqlite3 *mabase)
    {
    	char* errormsg;
    	if (sqlite3_exec(mabase, "SELECT mesure FROM energieQ", callback, 0, &errormsg) != SQLITE_OK)
    	{
    		cerr <<"SQL error : " << errormsg << endl;
    		sqlite3_free(errormsg);
    		return -1;
    	}
    	return 0;
    }
    Merci quand meme ! J'espere que ca servira a quelqu'un !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. connexion à Sqlite3 sur un serveur
    Par Bushido14 dans le forum SQLite
    Réponses: 2
    Dernier message: 09/11/2010, 00h41
  2. Réponses: 1
    Dernier message: 08/03/2010, 20h37
  3. Delphi 5 ADO chaine de connexion SQLite3
    Par benjyyyyy dans le forum Bases de données
    Réponses: 0
    Dernier message: 12/06/2008, 13h02
  4. Tester connexion Internet active sous Windows
    Par Altau dans le forum Développement
    Réponses: 3
    Dernier message: 12/08/2002, 13h43
  5. Je ne peux établir une connexion cliente sous Linux.
    Par Anonymous dans le forum CORBA
    Réponses: 5
    Dernier message: 16/04/2002, 16h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo