* Break backwards compatibility
* Allow to deserialize only base-data of packages and build
actions to potentially speed up showing tables
* Speed up package search in many cases by only deserializing
base-data (unless details are actually wanted)
* Avoid creation of map with all archive contents; instead parse packages
while walking though the archive
* Avoid instantiation of std::string in come cases (using std::string_view)
* Reuse libarchive's archive entry when walking though archive
* Use visitor-based database parser in all places to avoid intermediate big
array with all package objects
Especially when enabling files DBs it is quite problematic to store all
package objects of a database within one big array. This change avoids the
array and instead adds the packages directly. The disadvantage is that
clearing the database isn't as simple anymore.
* Treat an empty archive buffer/file as error as this should never happen
and it is better to fail early than replacing existing data with nothing
* Query error message also when opening archive from file
* Do HTTP head request first when loading database from mirror to avoid
downloading the full database all the time
* Use the last modification date of the local database file because with
the persistent storage even local database reloads became a bit expensive