Nettoyer la base de donnée de Gwibber
Gwibber est un client pour réseaux sociaux (StatusNet, Twitter & co) assez sympa. Seulement, il a un problème : sa base de donnée à tendance à augmenter au fur et à mesure du temps. Aujourd’hui le fichier ~/.config/gwibber/gwibber.sqlite faisait 132MB chez moi, c’est beaucoup pour gérer juste un flux Twitter et un StatusNet.
En fouillant un peu le code, j’ai trouvé la fonction de maintenance qui sert à supprimer les 2000 plus vieux status au démarrage. Seulement, les status ne sont pas la seule chose qui sont stockées dans la base de donnée, il y a aussi les liens, une crasse qui augmente vite. La preuve :
$ cd ~/.config/gwibber/ $ ls -lh gwibber.sqlite -rw-r--r-- 1 mart users 132M Nov 2 12:34 gwibber.sqlite $ sqlite3 gwibber.sqlite SQLite version 3.7.14.1 2012-10-04 19:37:12 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> select count(*) from messages where stream = 'links'; 39622
Ouch 40000 liens stockés, pas étonnant que ça monte. J’avais ouvert un bug report à ce sujet là il y a plus de deux mois mais je n’ai eu aucune réponse. Tant pis, on est jamais mieux servi que par soit même de toute façon. On peut donc supprimer les plus vieux en modifiant un peu la commande (triviale) de la fonction de maintenance pour obtenir:
DELETE FROM messages WHERE operation = 'receive' AND stream = 'links' AND time IN (SELECT CAST (time AS int) FROM (SELECT time FROM messages WHERE operation = 'receive' AND stream = 'links' AND time != 0 ORDER BY time ASC LIMIT (SELECT COUNT(time) FROM messages WHERE operation = 'receive' AND stream = 'links' AND time != 0) - 2000) ORDER BY time ASC);
Après avoir lancé cette commande dans le shell sqlite, on purge le tout et tadaaaaam
sqlite> select count(*) from messages where stream = 'links'; 3071 sqlite> VACUUM; $ ls -lh gwibber.sqlite -rw-r--r-- 1 mart users 41M Nov 2 12:37 gwibber.sqlite
41MB, pas mal le nettoyage. On peut même faire mieux en supprimant les autres types de status qui prennent un peu trop de place. Testez chez vous pour voir ce qui encombre le plus.
sqlite> select count(*), stream from messages group by stream; 4317|images 3084|links 4372|messages 44|private 6|profile 629|replies 39|send_thread 4703|user 1235|videos
Hmmm un peu trop d’images chez moi, ne gardons que les 1000 dernières.
sqlite> DELETE FROM messages WHERE operation = 'receive' AND stream = 'images' AND time IN (SELECT CAST (time AS int) FROM (SELECT time FROM messages WHERE operation = 'receive' AND stream = 'images' AND time != 0 ORDER BY time ASC LIMIT (SELECT COUNT(time) FROM messages WHERE operation = 'receive' AND stream = 'images' AND time != 0) - 1000) ORDER BY time ASC); sqlite> VACUUM; $ ls -lh gwibber.sqlite -rw-r--r-- 1 mart users 34M Nov 2 13:11 gwibber.sqlite
Vous pouvez facilement jouer un peu avec la base de donnée en changeant les paramètres mais prudence. Je n’ai pas inspecté en long et en large la structure et cette façon de faire n’est peut être pas la plus propre (si vous avez beaucoup de lien par message, vous risquez d’en effacer trop par exemple). Mais bon, je n’avais pas envie de passer 2h là dessus et en sachant que je ne retourne rarement plus loin que les 100 derniers status, je ne prend pas trop de risque en nettoyant dans les 2000 derniers. À vous de voir… Vous pouvez aussi mettre les commandes dans un cron pour automatiser tout ça pour garder la base de donnée à une taille raisonnable.