Remove dropline backend support
Test / build (push) Successful in 43s

This commit is contained in:
2026-05-04 15:37:47 +02:00
parent d84e192ae9
commit 2def836b73
12 changed files with 829 additions and 1264 deletions
+1
View File
@@ -6,6 +6,7 @@ cmake_minimum_required(VERSION 4.0.0)
project(Katja LANGUAGES CXX) project(Katja LANGUAGES CXX)
include(CTest) include(CTest)
include(GNUInstallDirs)
option(KATJA_BUILD_CLI "Build command line interface" ON) option(KATJA_BUILD_CLI "Build command line interface" ON)
+2 -2
View File
@@ -7,8 +7,8 @@ pkg_check_modules(deps REQUIRED IMPORTED_TARGET glib-2.0 gio-2.0)
add_library(backend) add_library(backend)
target_sources(backend target_sources(backend
INTERFACE job.h utils.h pkgtools.h slackpkg.h dl.h INTERFACE job.h utils.h pkgtools.h slackpkg.h
PRIVATE job.cc utils.cc pkgtools.cc slackpkg.cc dl.cc PRIVATE job.cc utils.cc pkgtools.cc slackpkg.cc
) )
configure_file(config.h.in ${CMAKE_BINARY_DIR}/generated/config.h) configure_file(config.h.in ${CMAKE_BINARY_DIR}/generated/config.h)
-293
View File
@@ -1,293 +0,0 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
#include <sqlite3.h>
#include <stdlib.h>
#include <gio/gio.h>
#include "dl.h"
#include "utils.h"
namespace katja
{
/**
* katja::Dl::collect_cache_info:
* @tmpl: temporary directory for downloading the files.
*
* Download files needed to get the information like the list of packages
* in available repositories, updates, package descriptions and so on.
*
* Returns: List of files needed for building the cache.
**/
GSList *
Dl::collect_cache_info (const char *tmpl) noexcept
{
CURL *curl = nullptr;
GSList *file_list = nullptr;
GFile *tmp_dir, *repo_tmp_dir;
/* Create the temporary directory for the repository */
tmp_dir = g_file_new_for_path(tmpl);
repo_tmp_dir = g_file_get_child(tmp_dir, this->get_name ());
g_file_make_directory(repo_tmp_dir, nullptr, nullptr);
/* There is no ChangeLog yet to check if there are updates or not. Just mark the index file for download */
auto source_dest = static_cast<char **> (g_malloc_n(3, sizeof(char *)));
source_dest[0] = g_strdup(this->index_file);
source_dest[1] = g_build_filename(tmpl,
this->get_name (),
"IndexFile",
nullptr);
source_dest[2] = nullptr;
/* Check if the remote file can be found */
if (get_file(&curl, source_dest[0], nullptr))
{
g_strfreev(source_dest);
}
else
{
file_list = g_slist_append(file_list, source_dest);
}
g_object_unref(repo_tmp_dir);
g_object_unref(tmp_dir);
if (curl)
{
curl_easy_cleanup(curl);
}
return file_list;
}
/**
* katja::Dl::generate_cache:
* @job_data: A #JobData.
* @tmpl: temporary directory for downloading the files.
*
* Download files needed to get the information like the list of packages
* in available repositories, updates, package descriptions and so on.
*
* Returns: List of files needed for building the cache.
**/
void
Dl::generate_cache(JobData *job_data, const char *tmpl) noexcept
{
char **line_tokens, **pkg_tokens, *line, *collection_name = nullptr, *list_filename;
bool skip = false;
GFile *list_file;
GFileInputStream *fin;
GDataInputStream *data_in = nullptr;
sqlite3_stmt *stmt = nullptr;
/* Check if the temporary directory for this repository exists. If so the file metadata have to be generated */
list_filename = g_build_filename(tmpl,
this->get_name (),
"IndexFile",
nullptr);
list_file = g_file_new_for_path(list_filename);
if (!(fin = g_file_read(list_file, nullptr, nullptr)))
{
goto out;
}
data_in = g_data_input_stream_new(G_INPUT_STREAM(fin));
/* Remove the old entries from this repository */
if (sqlite3_prepare_v2(job_data->db,
"DELETE FROM repos WHERE repo LIKE @repo",
-1,
&stmt,
nullptr) == SQLITE_OK) {
sqlite3_bind_text(stmt, 1, this->get_name (), -1, SQLITE_TRANSIENT);
sqlite3_step(stmt);
sqlite3_finalize(stmt);
}
if (sqlite3_prepare_v2(job_data->db,
"INSERT INTO repos (repo_order, repo) VALUES (@repo_order, @repo)",
-1,
&stmt,
nullptr) != SQLITE_OK)
{
goto out;
}
sqlite3_bind_int(stmt, 1, this->get_order ());
sqlite3_bind_text(stmt, 2, this->get_name (), -1, SQLITE_TRANSIENT);
sqlite3_step(stmt);
if (sqlite3_finalize(stmt) != SQLITE_OK)
{
goto out;
}
/* Insert new records */
if ((sqlite3_prepare_v2(job_data->db,
"INSERT INTO pkglist (full_name, name, ver, arch, "
"summary, desc, compressed, uncompressed, cat, repo_order, ext) "
"VALUES (@full_name, @name, @ver, @arch, @summary, "
"@desc, @compressed, @uncompressed, @cat, @repo_order, @ext)",
-1,
&stmt,
nullptr) != SQLITE_OK))
{
goto out;
}
sqlite3_exec(job_data->db, "BEGIN TRANSACTION", nullptr, nullptr, nullptr);
while ((line = g_data_input_stream_read_line(data_in, nullptr, nullptr, nullptr)))
{
line_tokens = g_strsplit(line, ":", 0);
if ((g_strv_length(line_tokens) > 6)
&& !this->is_blacklisted (line_tokens[0]))
{
pkg_tokens = split_package_name(line_tokens[0]);
/* If the split_package_name doesn't return a full name and an
* extension, it is a collection. We save its name in this case */
if (pkg_tokens[3])
{
sqlite3_bind_text(stmt, 1, pkg_tokens[3], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, 9, "desktop-gnome", -1, SQLITE_STATIC);
if (g_strcmp0(line_tokens[1], "obsolete"))
{
sqlite3_bind_text(stmt, 11, pkg_tokens[4], -1, SQLITE_TRANSIENT);
}
else
{
sqlite3_bind_text(stmt, 11, "obsolete", -1, SQLITE_STATIC);
}
}
else if (!collection_name)
{
collection_name = g_strdup(pkg_tokens[0]);
sqlite3_bind_text(stmt, 1, line_tokens[0], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, 9, "collections", -1, SQLITE_STATIC);
sqlite3_bind_null(stmt, 11);
}
else
{
skip = true; /* Skip other candidates for collections */
}
if (skip)
{
skip = false;
}
else
{
sqlite3_bind_text(stmt, 2, pkg_tokens[0], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, 3, pkg_tokens[1], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, 4, pkg_tokens[2], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, 5, line_tokens[2], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, 6, line_tokens[2], -1, SQLITE_TRANSIENT);
sqlite3_bind_int(stmt, 7, atoi(line_tokens[5]));
sqlite3_bind_int(stmt, 8, atoi(line_tokens[5]));
sqlite3_bind_int(stmt, 10, this->get_order ());
sqlite3_step(stmt);
sqlite3_clear_bindings(stmt);
sqlite3_reset(stmt);
}
g_strfreev(pkg_tokens);
}
g_strfreev(line_tokens);
g_free(line);
}
/* Create a collection entry */
if (collection_name && g_seekable_seek(G_SEEKABLE(data_in), 0, G_SEEK_SET, nullptr, nullptr)
&& (sqlite3_prepare_v2(job_data->db,
"INSERT INTO collections (name, repo_order, collection_pkg) "
"VALUES (@name, @repo_order, @collection_pkg)",
-1,
&stmt,
nullptr) == SQLITE_OK))
{
while ((line = g_data_input_stream_read_line(data_in, nullptr, nullptr, nullptr)))
{
line_tokens = g_strsplit(line, ":", 0);
if ((g_strv_length(line_tokens) > 6)
&& !this->is_blacklisted (line_tokens[0]))
{
pkg_tokens = split_package_name(line_tokens[0]);
/* If not a collection itself */
if (pkg_tokens[3]) /* Save this package as a part of the collection */
{
sqlite3_bind_text(stmt, 1, collection_name, -1, SQLITE_TRANSIENT);
sqlite3_bind_int(stmt, 2, this->get_order ());
sqlite3_bind_text(stmt, 3, pkg_tokens[0], -1, SQLITE_TRANSIENT);
sqlite3_step(stmt);
sqlite3_clear_bindings(stmt);
sqlite3_reset(stmt);
}
g_strfreev(pkg_tokens);
}
g_strfreev(line_tokens);
g_free(line);
}
sqlite3_finalize(stmt);
}
g_free(collection_name);
sqlite3_exec(job_data->db, "END TRANSACTION", nullptr, nullptr, nullptr);
out:
if (data_in)
{
g_object_unref(data_in);
}
if (fin)
{
g_object_unref(fin);
}
g_object_unref(list_file);
g_free(list_filename);
}
Dl::~Dl () noexcept
{
if (this->blacklist)
{
g_regex_unref (this->blacklist);
}
g_free (this->name);
g_free (this->mirror);
g_free (this->index_file);
}
/**
* katja::Dl::Dl:
* @name: Repository name.
* @mirror: Repository mirror.
* @order: Repository order.
* @blacklist: Repository blacklist.
* @index_file: The index file URL.
*
* Constructor.
*
* Return value: New #katja::Dl.
**/
Dl::Dl (const char *name, const char *mirror,
std::uint8_t order, const char *blacklist, char *index_file) noexcept
{
GRegex *regex;
if (blacklist)
{
regex = static_cast<GRegex *> (g_regex_new (blacklist,
G_REGEX_OPTIMIZE, static_cast<GRegexMatchFlags> (0), nullptr));
}
else
{
regex = nullptr;
}
this->name = g_strdup (name);
this->mirror = g_strdup (mirror);
this->order = order;
this->blacklist = regex;
this->index_file = index_file;
}
}
-28
View File
@@ -1,28 +0,0 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
#pragma once
#include <cstdint>
#include "pkgtools.h"
#include "utils.h"
namespace katja
{
class Dl final : public Pkgtools
{
public:
Dl (const char *name, const char *mirror,
std::uint8_t order, const char *blacklist, char *index_file) noexcept;
~Dl () noexcept;
GSList *collect_cache_info (const char *tmpl) noexcept;
void generate_cache (JobData *job_data, const char *tmpl) noexcept;
private:
char *index_file;
};
}
+21 -97
View File
@@ -13,10 +13,8 @@
#include <curl/curl.h> #include <curl/curl.h>
#include <sqlite3.h> #include <sqlite3.h>
#include "job.h" #include "job.h"
#include "dl.h"
#include "pkgtools.h" #include "pkgtools.h"
#include "slackpkg.h" #include "slackpkg.h"
#include "utils.h"
using namespace katja; using namespace katja;
@@ -105,21 +103,8 @@ void pk_backend_initialize(GKeyFile *conf)
{ {
repo = new Slackpkg(groups[i], mirror, i + 1, blacklist, repo = new Slackpkg(groups[i], mirror, i + 1, blacklist,
g_key_file_get_string_list(key_conf, groups[i], "Priority", nullptr, nullptr)); g_key_file_get_string_list(key_conf, groups[i], "Priority", nullptr, nullptr));
}
else if (g_key_file_has_key(key_conf, groups[i], "IndexFile", nullptr))
{
repo = new Dl (groups[i], mirror, i + 1, blacklist,
g_key_file_get_string(key_conf, groups[i], "IndexFile", nullptr));
}
if (repo)
{
repos = g_slist_append(repos, repo); repos = g_slist_append(repos, repo);
} }
else
{
g_free(groups[i]);
}
g_free(mirror); g_free(mirror);
g_free(blacklist); g_free(blacklist);
} }
@@ -141,7 +126,7 @@ void pk_backend_destroy()
curl_global_cleanup(); curl_global_cleanup();
} }
void pk_backend_start_job(PkBackendJob *job) JobData *pk_backend_start_job()
{ {
char *db_filename = nullptr; char *db_filename = nullptr;
JobData *job_data = g_new0(JobData, 1); JobData *job_data = g_new0(JobData, 1);
@@ -156,16 +141,14 @@ void pk_backend_start_job(PkBackendJob *job)
goto out; goto out;
} }
pk_backend_job_set_user_data(job, job_data);
out: out:
g_free(db_filename); g_free(db_filename);
return job_data;
} }
void pk_backend_stop_job(PkBackendJob *job) void pk_backend_stop_job(JobData *job_data)
{ {
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
if (job_data->curl) if (job_data->curl)
{ {
curl_easy_cleanup(job_data->curl); curl_easy_cleanup(job_data->curl);
@@ -173,11 +156,9 @@ void pk_backend_stop_job(PkBackendJob *job)
sqlite3_close(job_data->db); sqlite3_close(job_data->db);
g_free(job_data); g_free(job_data);
pk_backend_job_set_user_data(job, nullptr);
} }
static void void pk_backend_search_thread(PkBackendJob *job, GVariant *params, const char *user_data)
pk_backend_search_thread (PkBackendJob *job, GVariant *params, void *user_data)
{ {
auto job_data = reinterpret_cast<katja::JobData *>(pk_backend_job_get_user_data(job)); auto job_data = reinterpret_cast<katja::JobData *>(pk_backend_job_get_user_data(job));
@@ -210,7 +191,7 @@ pk_backend_search_thread (PkBackendJob *job, GVariant *params, void *user_data)
} }
else if (info == katja::Info::installing && !pk_bitfield_contain(filters, PK_FILTER_ENUM_INSTALLED)) else if (info == katja::Info::installing && !pk_bitfield_contain(filters, PK_FILTER_ENUM_INSTALLED))
{ {
pk_backend_job_package(job, PK_INFO_ENUM_AVAILABLE, pk_backend_job_package(job, katja::Info::available,
reinterpret_cast<const char *>(sqlite3_column_text(stmt, 0)), reinterpret_cast<const char *>(sqlite3_column_text(stmt, 0)),
reinterpret_cast<const char *>(sqlite3_column_text(stmt, 1))); reinterpret_cast<const char *>(sqlite3_column_text(stmt, 1)));
} }
@@ -225,21 +206,6 @@ pk_backend_search_thread (PkBackendJob *job, GVariant *params, void *user_data)
g_free(search); g_free(search);
} }
void pk_backend_search_names(PkBackendJob *job, char **values)
{
pk_backend_job_thread_create(job, pk_backend_search_thread, (void *) "name", nullptr);
}
void pk_backend_search_details(PkBackendJob *job, char **values)
{
pk_backend_job_thread_create(job, pk_backend_search_thread, (void *) "desc", nullptr);
}
void pk_backend_search_groups(PkBackendJob *job, char **values)
{
pk_backend_job_thread_create(job, pk_backend_search_thread, (void *) "cat", nullptr);
}
void pk_backend_search_files(PkBackendJob *job, char **values) void pk_backend_search_files(PkBackendJob *job, char **values)
{ {
char *search; char *search;
@@ -262,13 +228,13 @@ void pk_backend_search_files(PkBackendJob *job, char **values)
ret = is_installed((char*) sqlite3_column_text(stmt, 2)); ret = is_installed((char*) sqlite3_column_text(stmt, 2));
if ((ret == Info::installed) || (ret == Info::updating)) if ((ret == Info::installed) || (ret == Info::updating))
{ {
pk_backend_job_package(job, PK_INFO_ENUM_INSTALLED, pk_backend_job_package(job, katja::Info::installed,
(char*) sqlite3_column_text(stmt, 0), (char*) sqlite3_column_text(stmt, 0),
(char*) sqlite3_column_text(stmt, 1)); (char*) sqlite3_column_text(stmt, 1));
} }
else if (ret == PK_INFO_ENUM_INSTALLING) else if (ret == katja::Info::installing)
{ {
pk_backend_job_package(job, PK_INFO_ENUM_AVAILABLE, pk_backend_job_package(job, katja::Info::available,
(char*) sqlite3_column_text(stmt, 0), (char*) sqlite3_column_text(stmt, 0),
(char*) sqlite3_column_text(stmt, 1)); (char*) sqlite3_column_text(stmt, 1));
} }
@@ -311,8 +277,9 @@ void pk_backend_get_details(PkBackendJob *job, char **package_ids)
g_strfreev(tokens); g_strfreev(tokens);
if (sqlite3_step(stmt) != SQLITE_ROW) if (sqlite3_step(stmt) != SQLITE_ROW)
{
goto out; goto out;
}
desc = g_string_new((char *) sqlite3_column_text(stmt, 0)); desc = g_string_new((char *) sqlite3_column_text(stmt, 0));
/* Regular expression for searching a homepage */ /* Regular expression for searching a homepage */
@@ -387,13 +354,13 @@ void pk_backend_resolve(PkBackendJob *job, char **packages)
{ {
if ((ret == Info::installed) || (ret == Info::updating)) if ((ret == Info::installed) || (ret == Info::updating))
{ {
pk_backend_job_package(job, PK_INFO_ENUM_INSTALLED, pk_backend_job_package(job, katja::Info::installed,
(char*) sqlite3_column_text(stmt, 0), (char*) sqlite3_column_text(stmt, 0),
(char*) sqlite3_column_text(stmt, 1)); (char*) sqlite3_column_text(stmt, 1));
} }
else if (ret == PK_INFO_ENUM_INSTALLING) else if (ret == katja::Info::installing)
{ {
pk_backend_job_package(job, PK_INFO_ENUM_AVAILABLE, pk_backend_job_package(job, katja::Info::available,
(char*) sqlite3_column_text(stmt, 0), (char*) sqlite3_column_text(stmt, 0),
(char*) sqlite3_column_text(stmt, 1)); (char*) sqlite3_column_text(stmt, 1));
} }
@@ -441,9 +408,6 @@ void pk_backend_download_packages(PkBackendJob *job, char **package_ids, const c
GSList *repo; GSList *repo;
if ((repo = g_slist_find_custom(repos, tokens[PK_PACKAGE_ID_DATA], cmp_repo))) if ((repo = g_slist_find_custom(repos, tokens[PK_PACKAGE_ID_DATA], cmp_repo)))
{ {
pk_backend_job_package(job, PK_INFO_ENUM_DOWNLOADING,
package_ids[i],
(char *) sqlite3_column_text(stmt, 0));
static_cast<Pkgtools *>(repo->data)->download(job, static_cast<Pkgtools *>(repo->data)->download(job,
directory, tokens[PK_PACKAGE_ID_NAME]); directory, tokens[PK_PACKAGE_ID_NAME]);
path = g_build_filename(directory, (char *) sqlite3_column_text(stmt, 1), nullptr); path = g_build_filename(directory, (char *) sqlite3_column_text(stmt, 1), nullptr);
@@ -670,24 +634,7 @@ void pk_backend_get_updates(PkBackendJob *job)
full_name = g_strdup((char *) sqlite3_column_text(stmt, 0)); full_name = g_strdup((char *) sqlite3_column_text(stmt, 0));
if (!g_strcmp0((char *) sqlite3_column_text(stmt, 6), "obsolete")) if (g_strcmp0(pkg_metadata_filename, full_name))
{ /* Remove if obsolete */
pkg_id = pk_package_id_build(tokens[PK_PACKAGE_ID_NAME],
tokens[PK_PACKAGE_ID_VERSION],
tokens[PK_PACKAGE_ID_ARCH],
"obsolete");
/* TODO:
* 1: Use the repository name instead of "obsolete" above and check in pk_backend_update_packages()
if the package is obsolete or not
* 2: Get description from /var/log/packages, not from the database */
desc = g_strdup((char *) sqlite3_column_text(stmt, 5));
pk_backend_job_package(job, PK_INFO_ENUM_REMOVING, pkg_id, desc);
g_free(desc);
g_free(pkg_id);
}
else if (g_strcmp0(pkg_metadata_filename, full_name))
{ /* Update available */ { /* Update available */
pkg_id = pk_package_id_build((char *) sqlite3_column_text(stmt, 1), pkg_id = pk_package_id_build((char *) sqlite3_column_text(stmt, 1),
(char *) sqlite3_column_text(stmt, 2), (char *) sqlite3_column_text(stmt, 2),
@@ -695,7 +642,7 @@ void pk_backend_get_updates(PkBackendJob *job)
(char *) sqlite3_column_text(stmt, 4)); (char *) sqlite3_column_text(stmt, 4));
desc = g_strdup((char *) sqlite3_column_text(stmt, 5)); desc = g_strdup((char *) sqlite3_column_text(stmt, 5));
pk_backend_job_package(job, PK_INFO_ENUM_NORMAL, pkg_id, desc); pk_backend_job_package(job, katja::Info::updating, pkg_id, desc);
g_free(desc); g_free(desc);
g_free(pkg_id); g_free(pkg_id);
@@ -715,7 +662,7 @@ out:
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
} }
void pk_backend_update_packages(PkBackendJob *job, char **package_ids) void pk_backend_update_packages(JobData *job_data, char **package_ids)
{ {
char *dest_dir_name, *cmd_line; char *dest_dir_name, *cmd_line;
unsigned i; unsigned i;
@@ -732,7 +679,7 @@ void pk_backend_update_packages(PkBackendJob *job, char **package_ids)
if (repo) if (repo)
{ {
static_cast<Pkgtools *> (repo->data)->download (job, static_cast<Pkgtools *>(repo->data)->download(job_data,
dest_dir_name, tokens[PK_PACKAGE_ID_NAME]); dest_dir_name, tokens[PK_PACKAGE_ID_NAME]);
} }
} }
@@ -752,7 +699,7 @@ void pk_backend_update_packages(PkBackendJob *job, char **package_ids)
if (repo) if (repo)
{ {
static_cast<Pkgtools *> (repo->data)->install (job, static_cast<Pkgtools *>(repo->data)->install(job_data,
tokens[PK_PACKAGE_ID_NAME]); tokens[PK_PACKAGE_ID_NAME]);
} }
} }
@@ -768,7 +715,7 @@ void pk_backend_update_packages(PkBackendJob *job, char **package_ids)
} }
} }
void pk_backend_refresh_cache(PkBackendJob *job, bool force) void pk_backend_refresh_cache(JobData *job_data, bool force)
{ {
char *tmp_dir_name, *db_err, *path = nullptr; char *tmp_dir_name, *db_err, *path = nullptr;
int ret; int ret;
@@ -777,7 +724,6 @@ void pk_backend_refresh_cache(PkBackendJob *job, bool force)
GFileInfo *file_info = nullptr; GFileInfo *file_info = nullptr;
GError *err = nullptr; GError *err = nullptr;
sqlite3_stmt *stmt = nullptr; sqlite3_stmt *stmt = nullptr;
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
/* Create temporary directory */ /* Create temporary directory */
tmp_dir_name = g_dir_make_tmp("PackageKit.XXXXXX", &err); tmp_dir_name = g_dir_make_tmp("PackageKit.XXXXXX", &err);
@@ -843,7 +789,7 @@ void pk_backend_refresh_cache(PkBackendJob *job, bool force)
/* Refresh cache */ /* Refresh cache */
for (GSList *l = repos; l; l = g_slist_next(l)) for (GSList *l = repos; l; l = g_slist_next(l))
{ {
static_cast<Pkgtools *> (l->data)->generate_cache (job, tmp_dir_name); static_cast<Pkgtools *>(l->data)->generate_cache(job_data, tmp_dir_name);
} }
out: out:
@@ -862,25 +808,3 @@ out:
g_rmdir(tmp_dir_name); g_rmdir(tmp_dir_name);
g_free(tmp_dir_name); g_free(tmp_dir_name);
} }
void pk_backend_get_update_detail(PkBackendJob *job, char **package_ids)
{
unsigned i;
for (i = 0; package_ids[i] != nullptr; i++)
{
pk_backend_job_update_detail (job,
package_ids[i],
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
PK_RESTART_ENUM_NONE,
nullptr,
nullptr,
PK_UPDATE_STATE_ENUM_STABLE,
nullptr,
nullptr);
}
}
+6 -8
View File
@@ -6,16 +6,15 @@
#pragma once #pragma once
#include <glib/gstdio.h> #include <glib/gstdio.h>
#include "utils.h"
void pk_backend_initialize(GKeyFile *conf); void pk_backend_initialize(GKeyFile *conf);
void pk_backend_destroy(); void pk_backend_destroy();
void pk_backend_start_job(PkBackendJob *job); katja::JobData *pk_backend_start_job();
void pk_backend_stop_job(PkBackendJob *job); void pk_backend_stop_job(katja::JobData *job_data)
void pk_backend_search_names(PkBackendJob *job, char **values); void pk_backend_search_thread(PkBackendJob *job, GVariant *params, const char *user_data);
void pk_backend_search_details(PkBackendJob *job, char **values);
void pk_backend_search_groups(PkBackendJob *job, char **values);
void pk_backend_search_files(PkBackendJob *job, char **values); void pk_backend_search_files(PkBackendJob *job, char **values);
void pk_backend_get_details(PkBackendJob *job, char **package_ids); void pk_backend_get_details(PkBackendJob *job, char **package_ids);
@@ -26,6 +25,5 @@ void pk_backend_install_packages(PkBackendJob *job, char **package_ids);
void pk_backend_remove_packages(PkBackendJob *job, char **package_ids); void pk_backend_remove_packages(PkBackendJob *job, char **package_ids);
void pk_backend_get_updates(PkBackendJob *job); void pk_backend_get_updates(PkBackendJob *job);
void pk_backend_update_packages(PkBackendJob *job, char **package_ids); void pk_backend_update_packages(katja::JobData *job_data, char **package_ids);
void pk_backend_refresh_cache(PkBackendJob *job, bool force); void pk_backend_refresh_cache(katja::JobData *job, bool force);
void pk_backend_get_update_detail(PkBackendJob *job, char **package_ids);
+12 -28
View File
@@ -12,7 +12,7 @@ namespace katja
{ {
/** /**
* katja::Pkgtools::download: * katja::Pkgtools::download:
* @job: A #PkBackendJob. * @job_data: A #JobData.
* @dest_dir_name: Destination directory. * @dest_dir_name: Destination directory.
* @pkg_name: Package name. * @pkg_name: Package name.
* *
@@ -20,9 +20,7 @@ namespace katja
* *
* Returns: %TRUE on success, %FALSE otherwise. * Returns: %TRUE on success, %FALSE otherwise.
**/ **/
bool bool Pkgtools::download(JobData *job_data, char *dest_dir_name, char *pkg_name) noexcept
Pkgtools::download (JobData *job_data,
char *dest_dir_name, char *pkg_name) noexcept
{ {
char *dest_filename, *source_url; char *dest_filename, *source_url;
bool ret = false; bool ret = false;
@@ -35,8 +33,9 @@ Pkgtools::download (JobData *job_data,
-1, -1,
&statement, &statement,
nullptr) != SQLITE_OK)) nullptr) != SQLITE_OK))
{
return false; return false;
}
sqlite3_bind_text(statement, 1, pkg_name, -1, SQLITE_TRANSIENT); sqlite3_bind_text(statement, 1, pkg_name, -1, SQLITE_TRANSIENT);
sqlite3_bind_int(statement, 2, this->get_order()); sqlite3_bind_int(statement, 2, this->get_order());
@@ -49,17 +48,8 @@ Pkgtools::download (JobData *job_data,
sqlite3_column_text(statement, 1), sqlite3_column_text(statement, 1),
nullptr); nullptr);
if (!g_file_test(dest_filename, G_FILE_TEST_EXISTS)) ret = g_file_test(dest_filename, G_FILE_TEST_EXISTS)
{ || get_file(&curl, source_url, dest_filename) == CURLE_OK;
if (get_file(&curl, source_url, dest_filename) == CURLE_OK)
{
ret = true;
}
}
else
{
ret = true;
}
if (curl) if (curl)
{ {
@@ -80,8 +70,7 @@ Pkgtools::download (JobData *job_data,
* *
* Install a package. * Install a package.
**/ **/
void void Pkgtools::install(JobData *job_data, char *pkg_name) noexcept
Pkgtools::install (JobData *job_data, char *pkg_name) noexcept
{ {
char *pkg_filename, *cmd_line; char *pkg_filename, *cmd_line;
sqlite3_stmt *statement = nullptr; sqlite3_stmt *statement = nullptr;
@@ -127,8 +116,7 @@ Pkgtools::~Pkgtools () noexcept
* *
* Returns: Repository name. * Returns: Repository name.
**/ **/
const char * const char *Pkgtools::get_name() const noexcept
Pkgtools::get_name () const noexcept
{ {
return this->name; return this->name;
} }
@@ -140,8 +128,7 @@ Pkgtools::get_name () const noexcept
* *
* Returns: Repository mirror. * Returns: Repository mirror.
**/ **/
const char * const char *Pkgtools::get_mirror() const noexcept
Pkgtools::get_mirror () const noexcept
{ {
return this->mirror; return this->mirror;
} }
@@ -153,8 +140,7 @@ Pkgtools::get_mirror () const noexcept
* *
* Returns: Repository order. * Returns: Repository order.
**/ **/
guint8 guint8 Pkgtools::get_order() const noexcept
Pkgtools::get_order () const noexcept
{ {
return this->order; return this->order;
} }
@@ -167,12 +153,10 @@ Pkgtools::get_order () const noexcept
* *
* Returns: %TRUE if the package is blacklisted, %FALSE otherwise. * Returns: %TRUE if the package is blacklisted, %FALSE otherwise.
**/ **/
bool bool Pkgtools::is_blacklisted(const char *pkg) const noexcept
Pkgtools::is_blacklisted (const char *pkg) const noexcept
{ {
return this->blacklist return this->blacklist
&& g_regex_match (this->blacklist, && g_regex_match (this->blacklist, pkg, static_cast<GRegexMatchFlags>(0), nullptr);
pkg, static_cast<GRegexMatchFlags> (0), nullptr);
} }
} }
+2 -5
View File
@@ -21,13 +21,11 @@ public:
virtual ~Pkgtools() noexcept; virtual ~Pkgtools() noexcept;
bool download (JobData *job_data, bool download(JobData *job_data, char *dest_dir_name, char *pkg_name) noexcept;
char *dest_dir_name, char *pkg_name) noexcept;
void install(JobData *job_data, char *pkg_name) noexcept; void install(JobData *job_data, char *pkg_name) noexcept;
virtual GSList *collect_cache_info (const char *tmpl) noexcept = 0; virtual GSList *collect_cache_info (const char *tmpl) noexcept = 0;
virtual void generate_cache (JobData *job_data, virtual void generate_cache(JobData *job_data, const char *tmpl) noexcept = 0;
const char *tmpl) noexcept = 0;
protected: protected:
char *name = nullptr; char *name = nullptr;
@@ -35,5 +33,4 @@ protected:
std::uint8_t order; std::uint8_t order;
GRegex *blacklist = nullptr; GRegex *blacklist = nullptr;
}; };
} }
+6 -19
View File
@@ -12,15 +12,14 @@ GHashTable *Slackpkg::cat_map = nullptr;
/* /*
* katja::Slackpkg::manifest: * katja::Slackpkg::manifest:
* @job: a #PkBackendJob. * @job: a #JobData.
* @tmpl: temporary directory. * @tmpl: temporary directory.
* @filename: manifest filename * @filename: manifest filename
* *
* Parse the manifest file and save the file list in the database. * Parse the manifest file and save the file list in the database.
*/ */
void void
Slackpkg::manifest (PkBackendJob *job, Slackpkg::manifest(JobData *job_data, const char *tmpl, char *filename) noexcept
const char *tmpl, char *filename) noexcept
{ {
FILE *manifest; FILE *manifest;
int err, read_len; int err, read_len;
@@ -32,7 +31,6 @@ Slackpkg::manifest (PkBackendJob *job,
GRegex *pkg_expr = nullptr, *file_expr = nullptr; GRegex *pkg_expr = nullptr, *file_expr = nullptr;
GMatchInfo *match_info; GMatchInfo *match_info;
sqlite3_stmt *statement = nullptr; sqlite3_stmt *statement = nullptr;
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
path = g_build_filename(tmpl, path = g_build_filename(tmpl,
this->get_name(), this->get_name(),
@@ -252,10 +250,7 @@ Slackpkg::generate_cache (JobData *job_data, const char *tmpl) noexcept
sqlite3_stmt *insert_statement = nullptr, *update_statement = nullptr, *insert_default_statement = nullptr, *statement; sqlite3_stmt *insert_statement = nullptr, *update_statement = nullptr, *insert_default_statement = nullptr, *statement;
/* Check if the temporary directory for this repository exists, then the file metadata have to be generated */ /* Check if the temporary directory for this repository exists, then the file metadata have to be generated */
packages_txt = g_build_filename(tmpl, packages_txt = g_build_filename(tmpl, this->get_name(), "PACKAGES.TXT", nullptr);
this->get_name (),
"PACKAGES.TXT",
nullptr);
list_file = g_file_new_for_path(packages_txt); list_file = g_file_new_for_path(packages_txt);
fin = g_file_read(list_file, nullptr, nullptr); fin = g_file_read(list_file, nullptr, nullptr);
g_object_unref(list_file); g_object_unref(list_file);
@@ -271,11 +266,7 @@ Slackpkg::generate_cache (JobData *job_data, const char *tmpl) noexcept
&statement, &statement,
nullptr) == SQLITE_OK) nullptr) == SQLITE_OK)
{ {
sqlite3_bind_text(statement, sqlite3_bind_text(statement, 1, this->get_name(), -1, SQLITE_TRANSIENT);
1,
this->get_name (),
-1,
SQLITE_TRANSIENT);
sqlite3_step(statement); sqlite3_step(statement);
sqlite3_finalize(statement); sqlite3_finalize(statement);
} }
@@ -288,11 +279,7 @@ Slackpkg::generate_cache (JobData *job_data, const char *tmpl) noexcept
goto out; goto out;
} }
sqlite3_bind_int(statement, 1, this->get_order()); sqlite3_bind_int(statement, 1, this->get_order());
sqlite3_bind_text(statement, sqlite3_bind_text(statement, 2, this->get_name(), -1, SQLITE_TRANSIENT);
2,
this->get_name (),
-1,
SQLITE_TRANSIENT);
sqlite3_step(statement); sqlite3_step(statement);
sqlite3_finalize(statement); sqlite3_finalize(statement);
@@ -433,7 +420,7 @@ Slackpkg::generate_cache (JobData *job_data, const char *tmpl) noexcept
for (char **p = this->priority; *p; p++) for (char **p = this->priority; *p; p++)
{ {
filename = g_strconcat(*p, "-MANIFEST.bz2", nullptr); filename = g_strconcat(*p, "-MANIFEST.bz2", nullptr);
manifest (job, tmpl, filename); manifest(job_data, tmpl, filename);
g_free(filename); g_free(filename);
} }
out: out:
+1 -2
View File
@@ -27,8 +27,7 @@ private:
static const std::size_t max_buf_size = 8192; static const std::size_t max_buf_size = 8192;
char **priority = nullptr; char **priority = nullptr;
void manifest (PkBackendJob *job, void manifest(JobData *job_data, const char *tmpl, char *filename) noexcept;
const char *tmpl, char *filename) noexcept;
}; };
} }
+5 -11
View File
@@ -22,8 +22,7 @@ namespace katja
* *
* Returns: CURLE_OK (zero) on success, non-zero otherwise. * Returns: CURLE_OK (zero) on success, non-zero otherwise.
**/ **/
CURLcode CURLcode get_file(CURL **curl, char *source_url, char *dest)
get_file (CURL **curl, char *source_url, char *dest)
{ {
char *dest_dir_name; char *dest_dir_name;
FILE *fout = nullptr; FILE *fout = nullptr;
@@ -77,8 +76,7 @@ get_file (CURL **curl, char *source_url, char *dest)
* katja::split_package_name: * katja::split_package_name:
* Got the name of a package, without version-arch-release data. * Got the name of a package, without version-arch-release data.
**/ **/
char ** char **split_package_name(const char *pkg_filename)
split_package_name (const char *pkg_filename)
{ {
char *pkg_full_name; char *pkg_full_name;
char **pkg_tokens; char **pkg_tokens;
@@ -129,13 +127,11 @@ split_package_name (const char *pkg_filename)
* katja::is_installed: * katja::is_installed:
* Checks if a package is already installed in the system. * Checks if a package is already installed in the system.
* *
* Params: * @pkg_fullname: Package name should be looked for.
* pkg_fullname = Package name should be looked for.
* *
* Returns: Package installation information. * Returns: Package installation information.
**/ **/
Info Info is_installed(const char *pkg_fullname)
is_installed (const char *pkg_fullname)
{ {
GFileEnumerator *pkg_metadata_enumerator; GFileEnumerator *pkg_metadata_enumerator;
GFileInfo *pkg_metadata_file_info; GFileInfo *pkg_metadata_file_info;
@@ -207,7 +203,6 @@ is_installed (const char *pkg_fullname)
{ {
ret = Info::updating; ret = Info::updating;
} }
} }
g_object_unref(pkg_metadata_file_info); g_object_unref(pkg_metadata_file_info);
@@ -225,8 +220,7 @@ is_installed (const char *pkg_fullname)
/** /**
* katja::cmp_repo: * katja::cmp_repo:
**/ **/
int int cmp_repo(const void *a, const void *b)
cmp_repo (const void *a, const void *b)
{ {
auto repo = static_cast<const Pkgtools *> (a); auto repo = static_cast<const Pkgtools *> (a);
+3 -1
View File
@@ -24,7 +24,9 @@ enum class Info
// A different version is installed. // A different version is installed.
updating, updating,
// Available, but not installed. // Available, but not installed.
installing installing,
// Available.
available
}; };
CURLcode get_file(CURL **curl, char *source_url, char *dest); CURLcode get_file(CURL **curl, char *source_url, char *dest);