Aller au contenu principal
Bienvenue sur Forum Puppy Linux - Toutou Linux - Astuces - Aides !
Lorsque vous n'êtes pas connectés vous pouvez visiter la totalité du forum mais avec certaines restrictions : cf le règlement pour les visiteurs non connectés. Vous êtes chaleureusement conviés à vous inscrire afin de bénéficier de toutes les fonctionnalités du forum et de participer aux échanges.
Sujet: SQLite3 et les conteneurs .zip (Lu 725 fois) sujet précédent - sujet suivant
0 Membres et 1 Invitédans ce sujet

SQLite3 et les conteneurs .zip

Bonjour les addictos,

un membre du forum qui connaît mon inclinaison pour les base de données (ou BDD) signalait à ma curiosité un article en pas français, et je l'en remercie encore une fois ici.
Ce membre me taquinait, car je ne l'avais pas traduit.
C'est chose faite grâce à un traducteur un ligne dont je tairais le nom (non, ce n'est pas deepl.com).

Voici cet article dont la source peut être consultée sur https://distrowatch.com/weekly.php?issue=20251006#tips :
Citer
Utiliser SQLite pour gérer des fichiers ZIP

SQLite est un logiciel de base de données incroyablement portable, puissant et léger qui fonctionne partout, des serveurs aux smartphones. Ce qui rend SQLite si populaire, c'est qu'il fonctionne avec des fichiers de base de données autonomes qui peuvent être stockés ou transférés n'importe où. De nombreuses technologies de base de données utilisent plusieurs fichiers et nécessitent la mise en place de services réseau pour permettre aux clients d'accéder aux bases de données à distance. Contrairement à cette approche traditionnelle, une base de données SQLite est stockée dans un seul fichier qui peut exister n'importe où et être accessible sans démon dédié. Le projet SQLite fournit des bibliothèques et des outils en ligne de commande pour travailler avec ces fichiers de base de données, ce qui facilite l'accès et le partage de la base de données sans mettre en place d'infrastructure supplémentaire. Cela rend SQLite idéal pour une utilisation dans les applications de bureau, les applications téléphoniques et les petits sites web. Il y a de fortes chances que le navigateur web que vous utilisez pour lire cet article utilise des bibliothèques SQLite et une base de données SQLite.

Le site web de SQLite explique ensuite son logiciel comme suit :

SQLite est une bibliothèque en langage C qui implémente un moteur de base de données SQL petit, rapide, autonome, très fiable et complet. SQLite est le moteur de base de données le plus utilisé dans le monde. SQLite est intégré dans tous les téléphones mobiles et la plupart des ordinateurs, et est inclus dans d'innombrables autres applications que les gens utilisent tous les jours.

Aujourd'hui, je veux parler d'une fonctionnalité de SQLite qui est moins connue, mais étonnamment flexible et pratique dans certaines situations. Plus précisément, je veux parler de la façon dont l'outil en ligne de commande de SQLite peut fonctionner, non seulement avec des fichiers de base de données, mais aussi avec des fichiers ZIP.

Habituellement, lorsque nous travaillons avec des archives ZIP, c'est soit via un simple outil en ligne de commande avec une syntaxe cryptique qui crée et extrait les fichiers ZIP, soit via une application de bureau dédiée à cette tâche. SQLite offre une troisième option : un outil en ligne de commande qui peut utiliser des instructions SQL pour créer des archives, afficher des informations sur les archives et extraire des fichiers.

Je veux partager quelques exemples de SQLite en action, en travaillant avec une archive ZIP simple pour montrer à quel point SQLite est agréablement flexible. De plus, je trouve que l'utilisation des commandes de base de données SQL pour gérer un fichier ZIP est agréablement étrange et que ce genre de chose est tout simplement amusant.

Tout d'abord, créons une archive ZIP super simple à l'ancienne, via la ligne de commande. Je commence par créer quatre fichiers texte : abc, def, xyz et mnop :

$ echo "Line one" > abc; echo "Line two" > def; echo "Line three" > xyz; echo "Line four" > mnop

Maintenant que nous avons quatre fichiers texte, chacun avec une ligne de texte, nous pouvons créer notre archive ZIP et y stocker les trois premiers fichiers texte. Cela se fait avec la commande zip, comme son nom l'indique :

$ zip myarchive.zip abc def xyz
      adding: abc (stored 0%)
      adding: def (stored 0%)
      adding: xyz (stored 0%)
     
Nous pouvons confirmer que l'archive a été créée avec succès en listant son contenu dans le terminal avec le programme unzip :

$ unzip -l myarchive.zip
Archive: myarchive.zip
Length Date Time Name
--------- ---------- ----- ----
9 2025-08-12 15:21 abc
9 2025-08-12 15:21 def
11 2025-08-12 15:21 xyz

Maintenant que nous avons notre petite archive ZIP, explorons comment SQLite peut nous aider à parcourir et gérer cette archive. Nous pouvons le faire en lançant le programme sqlite et en lui passant le nom de notre fichier ZIP :

$ sqlite3 myarchive.zip
SQLite version 3.46.1 2024-08-13 09:16:08
Enter ".help" for usage hints.
sqlite>

Maintenant, le programme SQLite a ouvert notre archive ZIP et nous pouvons commencer à explorer. Comme nous allons traiter l'archive comme une base de données, SQLite attribue aux différentes fonctionnalités du fichier des noms de champs de base de données, comme nous pouvons le voir ici en utilisant la commande ".schema" :

sqlite> .schema
    CREATE VIRTUAL TABLE zip USING zipfile('myarchive.zip')
    /* zip(name,mode,mtime,sz,rawdata,data,method) */;
   
Comme on peut le voir à partir du résultat de notre commande ".schema", chaque entrée (fichier ou dossier) dans l'archive a un nom, un mode (type de fichier et permissions), une date de modification et une taille. Chaque entrée a aussi des rawdata (les informations compressées), data (les informations décompressées) et method (le niveau de compression). La plupart du temps, nous serons probablement intéressés seulement par les champs nom, taille et données.

Disons que nous voulons voir une liste des fichiers dans l'archive avec la taille décompressée de chaque fichier. Nous pouvons voir tous les fichiers dans l'archive avec leurs tailles (en octets) en utilisant une commande "select" :

sqlite> SELECT name, sz FROM zip;
abc|9
def|9
xyz|11

Dans la commande ci-dessus, nous demandons à SQLite de nous montrer (select) le nom et la taille de chaque fichier de notre archive ZIP. Le résultat est une liste des trois fichiers que nous avons placés initialement dans l'archive, avec la taille décompressée de chaque fichier.

Ensuite, que faire si nous voulons voir le contenu d’un seul de nos fichiers texte sans l’extraire de l’archive ? Nous pouvons le faire avec une autre commande "select", en indiquant que nous voulons voir les données contenues dans un fichier. Dans ce cas, nous allons demander le contenu du deuxième fichier, def :

sqlite> SELECT data FROM zip WHERE name='def';
Line two

Le résultat est le texte "Line two" que nous avions initialement mis dans le fichier texte.

Peut-être que nous voulons supprimer un des fichiers de notre archive. Dans ce cas, nous pouvons utiliser la commande SQL "delete" pour l’effacer de notre fichier ZIP. Dans cet exemple, nous supprimons le fichier def de l’archive avec la commande "delete" puis nous vérifions qu’il a disparu avec une commande "select" :

sqlite> DELETE FROM zip WHERE name='def';
sqlite> SELECT name FROM zip;
abc
xyz

Comme nous pouvons le voir dans la liste des noms ci-dessus, le fichier def a été supprimé avec succès.

Je voudrais mentionner à ce moment que les commandes SQL ne sont pas sensibles à la casse. Cela signifie que la commande "SELECT name FROM zip;" et "select name from zip;" fonctionneront toutes les deux. Les mots-clés comme "select" et "delete" sont souvent affichés en majuscules dans les exemples pour rendre les différents éléments de la commande plus visibles.

Ensuite, que faire si nous voulons ajouter un nouveau fichier à notre archive ? Nous pouvons le faire en spécifiant le nom du nouveau fichier et son contenu. Cela signifie que nous pouvons inventer le contenu sur le moment, mais il est plus probable que ce que nous voulions faire est de lire les données d'un fichier. Nous pouvons charger un fichier dans l'archive en utilisant la fonction "readfile". Ici, nous lisons le fichier mnop en mémoire et l'insérons dans l'archive :

sqlite> INSERT INTO zip(name, data) values('mnop', readfile('mnop'));

La commande ci-dessus indique à SQLite que nous voulons « insérer » un nouveau fichier. Nous lui faisons savoir que nous allons fournir le nom et les données pour la nouvelle entrée dans l'archive. Ensuite, nous devons fournir deux valeurs, le nom du nouveau fichier et son contenu. Le contenu de mnop est chargé en utilisant la fonction "readfile". Nous pouvons confirmer que la nouvelle entrée a été ajoutée en utilisant à nouveau "select" :

sqlite> select name, sz from zip;
abc|9
xyz|11
mnop|10

Nous pouvons voir le contenu de la dernière entrée en demandant le champ data de l'archive stockée sous un nom de fichier spécifique :

sqlite> select data from zip where name='mnop';
Line four

Comme nous pouvons le voir ici, le fichier mnop contenait une ligne de texte, qui lit "Line four".

Une des grandes fonctionnalités de SQLite est que l'outil en ligne de commande peut être utilisé comme un client de base de données classique, comme montré ci-dessus où nous lui donnons des commandes de manière interactive. L'outil en ligne de commande peut aussi exécuter une seule requête sur une base de données ou une archive spécifiée. Cela nous permet d'utiliser SQLite dans des scripts non interactifs ou d'extraire des informations d'une archive et de les exporter ailleurs. Par exemple, si nous voulons extraire le contenu du fichier abc de myarchive.zip et le verser dans un nouveau fichier texte, nous pouvons le faire depuis la ligne de commande, en spécifiant le nom de l'archive et la commande SQL que nous voulons exécuter :

$ sqlite3 myarchive.zip "select data from zip where name='abc'" > newabc.txt
$ cat newabc.txt
Line one

Dans l'exemple ci-dessus, nous utilisons la commande sqlite3 pour exécuter une seule commande SQL sur le fichier myarchive.zip. Cela va afficher le contenu (données) du fichier texte abc stocké dans notre archive. Nous demandons ensuite à notre shell de verser le texte dans un nouveau fichier appelé newabc.txt. Sur la deuxième ligne, nous affichons le contenu du nouveau fichier pour confirmer que cela a fonctionné.

Cette fonctionnalité en ligne de commande nous permet de réaliser des requêtes rapides, soit de manière interactive, soit depuis un script. Par exemple, la commande suivante nous indiquera combien de fichiers se trouvent dans une archive. Cela s'obtient en utilisant la fonction SQL "count" :

$ sqlite3 large-archive.zip "select count(name) from zip;"
    240
   
On peut voir qu'il y a 240 fichiers et répertoires dans l'archive ZIP large-archive.zip. Alternativement, nous pourrions obtenir la taille totale (décompressée) de tous les fichiers dans l'archive en utilisant cette commande pour obtenir la somme de la taille de chaque fichier en octets :

$ sqlite3 large-archive.zip "select sum(sz) from zip;"
235771456

Certains pourraient débattre pour savoir si utiliser SQLite est plus pratique que d'autres outils, comme zip et unzip. Les outils en ligne de commande standard (et les applications de bureau) pour travailler avec les archives sont efficaces et pratiques. Cependant, quand il s'agit de commandes portables et scriptables qui peuvent être utilisées pour interroger ou manipuler le contenu des archives, il est difficile de battre SQLite en termes de formatage fiable et de lisibilité de ses commandes.
Je retiens au moins une chose : c'est que SQLite est presque PARTOUT, selon l'auteur de l'article.
C'est comme monsieur Jourdain qui prosait sans le savoir.

J'ai voulu essayé, mais avec la version 3.7.17 2013-05-20 00:56:22 de SQLite impossible d'analyser le conteneur .zip.

Bonne journée les aminches.
Vive Toutou Linux
"Tout le monde a le droit de vivre en paix !" dit une dame africaine.

 
Simple Audio Video Embedder