Tutoriel SQlite

Tutoriel SQlite - C++ - Programmation

Marsh Posté le 29-07-2007 à 18:50:31    

Bonjour,
je cherche desesperement un tutoriel pour utiliser SQlite en C/C++.
Car sur le site officiel, la documentation est assez succinte

Code :
  1. #include <stdio.h>
  2. #include <sqlite3.h>
  3. static int callback(void *NotUsed, int argc, char **argv, char **azColName){
  4.   int i;
  5.   for(i=0; i<argc; i++){
  6.     printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL" );
  7.   }
  8.   printf("\n" );
  9.   return 0;
  10. }
  11. int main(int argc, char **argv){
  12.   sqlite3 *db;
  13.   char *zErrMsg = 0;
  14.   int rc;
  15.   if( argc!=3 ){
  16.     fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
  17.     exit(1);
  18.   }
  19.   rc = sqlite3_open(argv[1], &db);
  20.   if( rc ){
  21.     fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
  22.     sqlite3_close(db);
  23.     exit(1);
  24.   }
  25.   rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
  26.   if( rc!=SQLITE_OK ){
  27.     fprintf(stderr, "SQL error: %s\n", zErrMsg);
  28.     sqlite3_free(zErrMsg);
  29.   }
  30.   sqlite3_close(db);
  31.   return 0;
  32. }


Le problème en fait est la fonction callBack
Je ne comprend absolument pas ce que c'est. (j'ai regardé la documentation mais c'est pas plus clair....)
 
Si quelqu'un a compris, je veux bien une explication  :D  
 
merci


Message édité par kray le 29-07-2007 à 18:58:20

---------------
I guess my real ennemy is me
Reply

Marsh Posté le 29-07-2007 à 18:50:31   

Reply

Marsh Posté le 30-07-2007 à 01:56:17    

Bah, c'est rien de sorcier. "callback" est juste la fonction qui va être appelée pour chaque ligne de ta requète SELECT (cette fonction n'est jamais appelée pour les DELETE, UPDATE, INSERT, REPLACE ....). 4 arguments sont passés :
 
- void * data : le 4ème argument passé à sqlite3_exec. Tu mets ce que tu veux.
- int argc : le nombre d'éléments dans les deux tables qui suivent.
- char ** argv : les valeurs de chaque colonne de ton SELECT (pour une seule ligne)
- char ** azColName : les noms des colones
 
Exemple :
select strftime('%s', 'now', 'localtime') as now;
 
Va appeler ton callback avec argc vallant 1, argv une table à 1 élément contenant le nb de secondes depuis le 1er janv 1970 et azColName une table avec un élément valant "now".

Reply

Marsh Posté le 30-05-2008 à 16:50:37    

Détérage de post !!
 
"- char ** argv : les valeurs de chaque colonne de ton SELECT (pour une seule ligne) "
 
Et pour récupérer plusieurs lignes, on fait comment ???
 
Merci

Reply

Marsh Posté le 30-05-2008 à 17:00:34    

Bah ton callback va être appelé pour chaque ligne. Sinon il y a la méthode des requètes pré-compilées (prepared statements). Là tu pourras faire une boucle au milieu de ton code au lieu de tout éparpiller dans des callbacks.

Reply

Marsh Posté le 30-05-2008 à 17:10:02    

ba ouai mais callback n'est pas appelé pour chaque ligne ( dans mon code) :
 
 
 
sqlstx = "SELECT * FROM donnees ORDER BY datetime DESC LIMIT 0,5";
 
sqlite3_exec(db, sqlstx, *callback, 0, NULL);
 
Je devrais obtenir les 5 dernières lignes, mais la j'ai que la dernière.
 
ps ( n'y a t il une meilleur requete pour obtenir les N dernières lignes ?)
 
 
 
merci

Reply

Marsh Posté le 30-05-2008 à 18:55:11    

Arf, laisse moi deviner : tu ne renvoie pas 0 dans ton callback.
 
Si tu renvoies une valeur différentes de 0, la requète sera interrompue et sqlite3_exec renverra SQLITE_ABORT. Invariant F12110 de http://www.sqlite.org/c3ref/exec.html

Reply

Marsh Posté le 02-06-2008 à 09:33:51    

malheureusement ce n'est pas ça :
 
int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
    int  i = 0;
 
    pthread_mutex_lock(&donnee);
    memset( donneesfi, 0, strlen(donneesfi));
    for(i=0; i<= 8; i++)
    {
        strcat(donneesfi, argv[i]);
        strcat(donneesfi, "!" );
 
    }
 
 
 
    pthread_mutex_unlock(&donnee);
 
    return 0;
 
}

Reply

Marsh Posté le 02-06-2008 à 10:07:47    

ah ! C'était une bétise ! le callback etait bien rapplé, je supprimé les données dans ma variables trop tot !!
 
voila. merci bien tpierron

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed