Tutorial sqlite

SQLite ?? C'est quoi ?

Non ce n'est un pas un SQL pour l'élite mais une petite librairie C qui permet d'utiliser une base de donnée embarquée.

Prérequis

Caractéristiques :

  • ACID : transaction Atomique, Cohérence, Isolation, Durabilité
  • Aucune configuration demandée
  • Implémente la plupart des requêtes SQL92
  • Toute la base de donnée en un fichier
  • Support des base de plusieurs tera octets
  • Libre (pas comme la bière)

Début en console

commande crée la base de donnée (fichier bdd.bd).

tutorial_SQLite@Club*Nix $ sqlite3 bdd.db
SQLite version 3.4.1
Enter ".help" for instructions
sqlite> CREATE TABLE table1 (id INTEGER, nom varchar(30), prenom varchar(30), message TEXT);
sqlite> INSERT INTO table1 values(42, "trax", "traxou", "je n'ai rien à dire de plus");
sqlite> SELECT * FROM table1;
42|trax|traxou|je n'ai rien à dire de plus
sqlite> .exit
  1. ouvre sqlite3 avec lui demandant d'utiliser le fichier "bdd.db" comme base de données. Si celui ci n'existe pas il est crée.
  2. Réponse de sqlite3
  3. Création d'une table "table1" à trois champs : "id" nombre entier, nom "chaine limité à 30 caractères", prénom idem, message de type text (longeur inderterminée)
  4. Insertion de valeurs
  5. Lecture de valeurs
  6. Les valeurs lues
  7. Sortie du programme (à noter le "." devant "exit"

Code C

L'exemple suivant présente l'exécution de requêtes sur la base de données.
Deux méthodes sont utilisées. La première étant une exécution dynamique : l'analyse de la reqête se fait pendant son exécution. La seconde méthode consiste à compiler la requête et à injecter les valeurs à chaque appelle (avec la méthode sqlite3_bind_le_type). Cela permet d'accroitre ma rapidité lors d'appels fréquents à une requête de même structure.

  1. #include <stdio.h>
  2. #include <sqlite3.h>
  3. #include <stdlib.h>
  4.  
  5. void step (int i){
  6. printf("step : ");
  7. switch (i){
  8. case SQLITE_DONE:
  9. printf ("ok ");
  10. break;
  11. case SQLITE_BUSY:
  12. printf ("oqp ");
  13. break;
  14. case SQLITE_ERROR:
  15. printf ("err ");
  16. break;
  17. case SQLITE_ROW:
  18. printf ("row ");
  19. break;
  20. case SQLITE_MISUSE:
  21. printf ("mis ");
  22. break;
  23. default:
  24. printf ("??? ");
  25. }
  26. printf("\n");
  27.  
  28. }
  29.  
  30. int callback (void *lokis, int nbCol, char **data, char **nomCol){
  31. for (int i = 0; i < nbCol; i++){
  32. printf ("%s \t", data[i]);
  33. }
  34. printf ("\n");
  35. return 0;
  36. }
  37. int main (int argc, char **argv){
  38. sqlite3 *db;
  39. char *zErrMsg = 0;
  40. int rc;
  41.  
  42. if (argc != 3){
  43. fprintf (stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
  44. }
  45.  
  46. rc = sqlite3_open ("bdd.db", &db);
  47. if (rc){
  48. fprintf (stderr, "Can't open database: %s\n", sqlite3_errmsg (db));
  49. sqlite3_close (db);
  50. exit (1);
  51. }
  52. /*-------------------------------- Créer une table ---------------------------*/
  53. char *requete0 = "CREATE TABLE table1 (id INTEGER, login varchar(30), pass varchar(30));";
  54. if (sqlite3_exec (db, requete0, callback, 0, &zErrMsg) != SQLITE_OK){
  55. printf (":(\n");
  56. }
  57.  
  58.  
  59. /*------------------------------- Créer un enregistrement première méthode ---*/
  60. char *requete1 = "INSERT INTO table1 values (0, 'trax', 'plop');";
  61. if (sqlite3_exec (db, requete1, callback, 0, &zErrMsg) != SQLITE_OK){
  62. printf (":(\n");
  63. }
  64.  
  65.  
  66. /*------------------------------- Créer un enregistrement deuxième méthode ---*/
  67. char *requete2 = "INSERT INTO table1 values(?, ?, ?);";
  68. sqlite3_stmt *stmt = NULL;
  69. if (sqlite3_prepare_v2 (db, requete2, 50, &stmt, NULL) != SQLITE_OK){
  70. printf (":(\n");
  71. }
  72.  
  73. sqlite3_bind_int (stmt, 1, 42);
  74. sqlite3_bind_text (stmt, 2, "traxou", 7, NULL);
  75. sqlite3_bind_text (stmt, 3, "plip", 5, NULL);
  76. step(sqlite3_step(stmt));
  77. sqlite3_reset (stmt);
  78.  
  79.  
  80. /*------------------------------- Lecture d'enregistrement -------------------*/
  81. char *requete3 = "SELECT * FROM table1;";
  82. if (sqlite3_exec (db, requete3, callback, 0, &zErrMsg) != SQLITE_OK){
  83. printf (":(\n");
  84. }
  85.  
  86. sqlite3_close (db);
  87. return 0;
  88. }

Comment compiler :
gcc test.c -o prog -lsqlite3

Catégories: