query rpmdb directly
Last month, I came across a nice little command line tool that displayed basic system information called afetch
. This program aims to be a fast and more minimal option versus screenfetch
or neofetch
.
./afetch
_____
/ __)\ USER jorp
| / \ \ DISTRO Fedora
___| |__/ / KERNEL 5.10.13-200.fc33.x86_64
/ (_ _)_/ UPTIME 237h 39m
/ / | | SHELL bash
\ \__/ | PKGS 3686
\(_____/
However, with all these programs, I noticed that execution time seemed to take a long time on Fedora.
Why? Well I started to dig through some neofetch
source code and discovered that the default method for counting installed packages is by counting the number of lines outputted by rpm -qa
. In my testing, this operation took an average of 2 seconds. afetch
used this same method as well.
So, there’s got to be a faster way, right?
Yes. (That I have only tested with Fedora, I’m unsure of file locations on other RPM-based distributions).
Let’s query the RPM database directly with sqlite
:
sqlite3 /var/lib/rpm/rpmdb.sqlite "select * from Name"
This operation seems to take 0.02 seconds on average:
time rpm -qa | wc -l
3686
real 0m1.967s
user 0m1.858s
sys 0m0.126s
time sqlite3 /var/lib/rpm/rpmdb.sqlite "select * from Name" | wc -l
3686
real 0m0.022s
user 0m0.010s
sys 0m0.016s
.. or about 89x faster.. hmm.
This is defnitely a neat little hack, but is probably unwise to implement in software since it’s more likely that the location of rpmdb.sqlite
will change before functionality of the rpm
package. (Although, you can try and check to see if the database exists in that location first).