From: Michael Tremer Date: Wed, 20 Jan 2021 22:03:51 +0000 (+0000) Subject: libpakfire: db: Use SQLite3 X-Git-Tag: 0.9.28~1285^2~832 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=26affd69da6d8db505cbc78b8df804d2ebc313f3;p=pakfire.git libpakfire: db: Use SQLite3 Signed-off-by: Michael Tremer --- diff --git a/Makefile.am b/Makefile.am index 10df2c61c..79c0d697a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -323,7 +323,8 @@ pkginclude_HEADERS += \ libpakfire_la_CFLAGS = \ $(AM_CFLAGS) \ -fvisibility=hidden \ - $(LIBGCRYPT_CFLAGS) + $(LIBGCRYPT_CFLAGS) \ + $(SQLITE3_CFLAGS) libpakfire_la_CPPFLAGS = \ $(AM_CPPFLAGS) \ @@ -342,7 +343,8 @@ libpakfire_la_LIBADD = \ $(GPGME_LIBS) \ $(LIBGCRYPT_LIBS) \ $(LZMA_LIBS) \ - $(SOLV_LIBS) + $(SOLV_LIBS) \ + $(SQLITE3_LIBS) libpakfire_la_DEPENDENCIES = \ src/libpakfire/libpakfire.sym \ diff --git a/configure.ac b/configure.ac index b0b5172e4..6a0b97946 100644 --- a/configure.ac +++ b/configure.ac @@ -175,6 +175,7 @@ LIBS="$save_LIBS" PKG_CHECK_MODULES([ARCHIVE], [libarchive >= 3.3.3]) PKG_CHECK_MODULES([PYTHON_DEVEL], [python-${PYTHON_VERSION}]) PKG_CHECK_MODULES([LZMA], [liblzma]) +PKG_CHECK_MODULES([SQLITE3], [sqlite3]) AM_PATH_LIBGCRYPT([1.8.0], [], [AC_MSG_ERROR([*** libgcrypt not found])]) AM_PATH_GPGME([1.6.0], [], [AC_MSG_ERROR([*** GPGME not found])]) diff --git a/src/libpakfire/db.c b/src/libpakfire/db.c index d40fb212d..db27817a4 100644 --- a/src/libpakfire/db.c +++ b/src/libpakfire/db.c @@ -21,6 +21,8 @@ #include #include +#include + #include #include #include @@ -35,9 +37,30 @@ struct pakfire_db { int nrefs; int mode; + + sqlite3* handle; }; +static void pakfire_db_free(struct pakfire_db* db) { + DEBUG(db->pakfire, "Releasing database at %p\n", db); + + // Close database handle + if (db->handle) { + int r = sqlite3_close(db->handle); + if (r != SQLITE_OK) { + ERROR(db->pakfire, "Could not close database handle: %s\n", + sqlite3_errmsg(db->handle)); + } + } + + pakfire_unref(db->pakfire); + + pakfire_free(db); +} + PAKFIRE_EXPORT int pakfire_db_open(struct pakfire_db** db, Pakfire pakfire, int flags) { + int r = 1; + struct pakfire_db* o = pakfire_calloc(1, sizeof(*o)); if (!o) return -ENOMEM; @@ -47,15 +70,43 @@ PAKFIRE_EXPORT int pakfire_db_open(struct pakfire_db** db, Pakfire pakfire, int o->pakfire = pakfire_ref(pakfire); o->nrefs = 1; - // Store mode - if (flags & PAKFIRE_DB_READWRITE) + int sqlite3_flags = 0; + + // Store mode & forward it to sqlite3 + if (flags & PAKFIRE_DB_READWRITE) { o->mode = PAKFIRE_DB_READWRITE; - else + sqlite3_flags |= SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE; + } else { o->mode = PAKFIRE_DB_READONLY; + sqlite3_flags |= SQLITE_OPEN_READONLY; + } + + // Make the filename + char* path = pakfire_make_path(o->pakfire, DATABASE_PATH); + if (!path) + goto END; + + // Try to open the sqlite3 database file + r = sqlite3_open_v2(path, &o->handle, sqlite3_flags, NULL); + if (r != SQLITE_OK) { + ERROR(pakfire, "Could not open database %s: %s\n", + path, sqlite3_errmsg(o->handle)); + + r = 1; + goto END; + } *db = o; + r = 0; + +END: + if (r) + pakfire_db_free(o); - return 0; + if (path) + free(path); + + return r; } PAKFIRE_EXPORT struct pakfire_db* pakfire_db_ref(struct pakfire_db* db) { @@ -64,14 +115,6 @@ PAKFIRE_EXPORT struct pakfire_db* pakfire_db_ref(struct pakfire_db* db) { return db; } -static void pakfire_db_free(struct pakfire_db* db) { - DEBUG(db->pakfire, "Releasing database at %p\n", db); - - pakfire_unref(db->pakfire); - - pakfire_free(db); -} - PAKFIRE_EXPORT struct pakfire_db* pakfire_db_unref(struct pakfire_db* db) { if (--db->nrefs > 0) return db; diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index 2a1802121..b822d8cfc 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -82,6 +82,23 @@ static int log_priority(const char* priority) { return 0; } +static int pakfire_populate_pool(Pakfire pakfire) { + struct pakfire_db* db; + int r; + + // Open database in read-only mode and try to load all installed packages + r = pakfire_db_open(&db, pakfire, PAKFIRE_DB_READWRITE); + if (r) + return r; + + // TODO + + // Free database + pakfire_db_unref(db); + + return 0; +} + // A utility function is already called pakfire_free static void _pakfire_free(Pakfire pakfire) { DEBUG(pakfire, "Releasing Pakfire at %p\n", pakfire); @@ -172,6 +189,14 @@ PAKFIRE_EXPORT int pakfire_create(Pakfire* pakfire, const char* path, const char // Set architecture of the pool pool_setarch(p->pool, p->arch); + // Populate pool + r = pakfire_populate_pool(p); + if (r) { + _pakfire_free(p); + + return r; + } + // Initialise cache pakfire_set_cache_path(p, CACHE_PATH);