[pacman-dev] libalpm and backends
Aurelien Foret
aurelien at archlinux.org
Wed Mar 8 17:40:26 EST 2006
Hello,
As a first step toward backend support, I slightly tweaked the database
code from libalpm into this direction.
Basically, I've moved all functions relating to the backend from db.c
inside a new file "be_files.c". The idea is to have several distinct
"be_XXX.c" files, one for each backend, implementing the hooks to access
database fields.
The functions that need to be implemented in order to write a new
backend are:
_alpm_db_open
_alpm_db_close
_alpm_db_rewind
_alpm_db_scan
_alpm_db_read
_alpm_db_write
_alpm_db_remove
So, the next step should be to allow users to choose a backend with the
configure script as follows ("files" is the default behavior):
./configure --backend=files
or
./configure --backend=gdbm
This option should impact the list of targets built in the libalpm
library: if gdbm is activated, only the object "be_gdbm.c" should be
compiled and linked inside the library.
As of now, what is missing is to implement this selection in the
configure.ac script and in the lib/libalpm/Makefile.am file.
Currently, the Makefile.am is as follows:
TARGETS = packege.o db.o cache.o list.o ...
TARGETS += be_files.o
This last line should be added conditionally depending on configure options.
And the final big step is to revamp the sync db archives handling.
To date, the database synchronization can't be easier: the library does
not even need to read the archive, it simply unpacks it in
/var/lib/pacman/<treename>.
It works well because gensync archives are mapped on the current "flat
files" database format.
Now, let's imagine we're using a different backend... that can't work
anymore: the library must read the archive, parse each entry and
db_write it to the database.
The following patch is implementing the whole thing:
http://aurelien.foret.free.fr/archlinux/pacman/patches/pacman-lib-backend.patch
Although the modifications are quite small and straightforward, I'm
submitting this patch for review to the pacman-dev ml because it has an
obvious external impact on sync db archives.
Here are some explanations.
To ease the pain, the idea is to rework gensync to simplify the sync db
archive content.
I reused the format from .PKGINFO files as used by makepkg and
implemented it in gensync.
For instance, in these conditions, an entry from the sync db archive is
a file named "dummy-1.0-1" with the following content:
pkgname = dummy
pkgver = 1.0-1
depend = foobar1
replaces = foobar2
csize = 123456789
...
instead of a subdirectory "dummy-1.0-1" containing two files:
dummy-1.0-1/desc:
%NAME%
dummy
%VERSION%
1.0-1
...
and dummy-1.0-1/depends:
%DEPENDS%
foobar1
...
This way, it is possible to reuse the function parsedesc from package.c
to parse both .PKGINFO files from package archives _and_ entries from
database archives.
IMO, this is quite efficient and simple: makepkg and gensync are using
the same format, and gensync database archives are simpler to parse and
analyze.
Finally, I think pacman 3.0 is the right moment to implement it.
We already agreed to break compatibility for sync databases by moving
"replaces" and "force" fields from "desc" to "depends" db files, and as
a consequence pacman 3 release will already require users to synchronize
their sync databases before being able to use them.
The gensync rework I'm suggesting will don't bring more hassle to the
upgrade from pacman 2.9 to pacman 3.0.
I'm interested to get feedbacks on the general idea and the
implementation, before possibly committing it.
--
Aurelien
More information about the pacman-dev
mailing list