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:
Résultats de l’exécution:
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