BCJ – 5 -Tables SQL

Le module sqltable permet d’implanter un système de gestion de fichiers tabulés à l’aide d’une syntaxe proche de Sql (Structured Query Langage). Ce module permet de gérer des bases de données de taille raisonnable (quelques milliers de lignes par table). Pour des données plus importantes ou des traitements complexes, il convient d’utiliser des systèmes tels que MariaDB, Sqlite,…

Ce module est disponible sur le site github. Pour créer une « base de données » il suffit de créer un répertoire. Ce répertoire contiendra l’ensemble des tables de l’application. Le module sqltable défini par cbsqltable.bcj permet uniquement d’utiliser un sgbd embarqué dans l’application. Il n’y a pas de serveur de sgbd.

Chaque table est implantée par deux fichiers tabulés:

  • nomTable.dat : valeurs de la table
  • nomTable.des : liste des noms de colonnes

Exemple pour une table telephone permettant de stocker des numéros et noms de téléphone on a:

telephone.des

numero	nom

telephone.dat

0601020304	martin
0604030201	durant

Les champs d’une ligne d’une table sont tous de type VARCHAR(?) . Le symbole ? signifie qu’un champ peut avoir un nombre quelconque de caractères. Le choix de cette implantation permet notamment d’optimiser la place occupée sur des supports tels que sdcard ou clés usb pour les Raspberry. L’inconvénient est de rendre les temps de traitements plus importants pour de gros volumes d’informations. Rappelons que cette implantation permet de traiter des tables de plusieurs milliers de lignes sur un Raspberry.

Exemple de programme:

Java

Résultats de l’exécution:

TypeScript

Le langage Sql implanté ne dispose pas de toutes les possibilités d’un sgbd classique. Les procédures ou fonctions autorisées sont:

func string runSql(string repbdd,string cmd,boolean ignorecase,string pathout)

* Execute une requete sql
*    repbdd     : repertoire contenant les tables
*    cmd        : requete sql
*    ignorecase : si true les expressions apres WHERE sont evaluees en ignorant la casse
*    pathout    : chemin du fichier tabule contenant les resultats
* Retourne
*    OK    si la requete s'est executee sans probleme
*    sinon message d'erreur
* 
*  Requetes possibles:
* 
*  select [first] liste Colonnes from nomTable [where expressionConditionnelle]
*        liste Colonnes:
*                * pour toutes les colonnes ou
*                suite de noms de colonnes separes par des virgules
*  create table nomTable ( suite de noms de colonnes separes par des virgules )
*       ex: create table rep (nom,telephone)
*  insert into nomTable values( suite de litteraux separes par des virgules )
*  delete nomTable where expressionConditionnelle
*  update nomTable set idcol = litteral  where expressionConditionnelle 
*                     ^----- , --------+
*  drop table nomTable 
*  show columns from nomTable
*  show tables
* 
*  Expression conditionnelle:
*        comparaison elementaire:
*              nom de colonne operateur litteral
*        operateurs ( de meme priorite )
*              = == < <= > >= != <> 
*              contains nocontains 
*              startswith nostartswith
*              endswith noendswith     
*              datene dateeq datele datege datelt dategt
*         operateurs ( priorite decroissante )  
*              and
*              or   
*       on peut utiliser ( ) pour forcer les priorites


proc debugSql(string repbdd,string requete,boolean ignorecase,string pathout)

Exécute une requête Sql et affiche les résultats de son exécution

func string selectFirst(string repbdd,string nomTable,string nomColonne,string valColonne)exception

Recherche la première ligne de la table pour un nom et une valeur de colonne donnes

Temps d’exécution

A titre indicatif, sur un Raspberry modèle B, il faut compter environ 4 secondes pour faire une recherche dans une table comportant 200000 lignes

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *