@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
+58
-134
@@ -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;
|
||||||
|
|
||||||
@@ -103,23 +101,10 @@ void pk_backend_initialize(GKeyFile *conf)
|
|||||||
|
|
||||||
if (g_key_file_has_key(key_conf, groups[i], "Priority", nullptr))
|
if (g_key_file_has_key(key_conf, groups[i], "Priority", nullptr))
|
||||||
{
|
{
|
||||||
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);
|
||||||
}
|
}
|
||||||
@@ -132,16 +117,16 @@ void pk_backend_destroy()
|
|||||||
{
|
{
|
||||||
g_debug("backend: destroy");
|
g_debug("backend: destroy");
|
||||||
|
|
||||||
for (GSList *l = repos; l; l = g_slist_next (l))
|
for (GSList *l = repos; l; l = g_slist_next(l))
|
||||||
{
|
{
|
||||||
delete static_cast<Pkgtools *> (l->data);
|
delete static_cast<Pkgtools *>(l->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_slist_free (repos);
|
g_slist_free(repos);
|
||||||
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,71 +156,54 @@ 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));
|
||||||
|
|
||||||
char **vals;
|
char **vals;
|
||||||
PkBitfield filters;
|
PkBitfield filters;
|
||||||
g_variant_get (params, "(t^a&s)", &filters, &vals);
|
g_variant_get(params, "(t^a&s)", &filters, &vals);
|
||||||
char *search = g_strjoinv ("%", vals);
|
char *search = g_strjoinv("%", vals);
|
||||||
|
|
||||||
const char *generate_query = "SELECT (p1.name || ';' || p1.ver || ';' || p1.arch || ';' || r.repo), p1.summary, "
|
const char *generate_query = "SELECT (p1.name || ';' || p1.ver || ';' || p1.arch || ';' || r.repo), p1.summary, "
|
||||||
"p1.full_name FROM pkglist AS p1 NATURAL JOIN repos AS r "
|
"p1.full_name FROM pkglist AS p1 NATURAL JOIN repos AS r "
|
||||||
"WHERE p1.%s LIKE '%%%q%%' AND p1.ext NOT LIKE 'obsolete' AND p1.repo_order = "
|
"WHERE p1.%s LIKE '%%%q%%' AND p1.ext NOT LIKE 'obsolete' AND p1.repo_order = "
|
||||||
"(SELECT MIN(p2.repo_order) FROM pkglist AS p2 WHERE p2.name = p1.name GROUP BY p2.name)";
|
"(SELECT MIN(p2.repo_order) FROM pkglist AS p2 WHERE p2.name = p1.name GROUP BY p2.name)";
|
||||||
char *query = sqlite3_mprintf (generate_query, user_data, search);
|
char *query = sqlite3_mprintf(generate_query, user_data, search);
|
||||||
|
|
||||||
sqlite3_stmt *stmt;
|
sqlite3_stmt *stmt;
|
||||||
if ((sqlite3_prepare_v2 (job_data->db, query, -1, &stmt, nullptr) == SQLITE_OK))
|
if ((sqlite3_prepare_v2(job_data->db, query, -1, &stmt, nullptr) == SQLITE_OK))
|
||||||
{
|
{
|
||||||
/* Now we're ready to output all packages */
|
/* Now we're ready to output all packages */
|
||||||
while (sqlite3_step (stmt) == SQLITE_ROW)
|
while (sqlite3_step(stmt) == SQLITE_ROW)
|
||||||
{
|
{
|
||||||
katja::Info info = katja::is_installed (
|
katja::Info info = katja::is_installed(
|
||||||
reinterpret_cast<const char *> (sqlite3_column_text (stmt, 2)));
|
reinterpret_cast<const char *>(sqlite3_column_text(stmt, 2)));
|
||||||
|
|
||||||
if ((info == katja::Info::installed || info == katja::Info::updating)
|
if ((info == katja::Info::installed || info == katja::Info::updating)
|
||||||
&& !pk_bitfield_contain (filters, PK_FILTER_ENUM_NOT_INSTALLED))
|
&& !pk_bitfield_contain(filters, PK_FILTER_ENUM_NOT_INSTALLED))
|
||||||
{
|
{
|
||||||
pk_backend_job_package (job, katja::Info::installed,
|
pk_backend_job_package(job, katja::Info::installed,
|
||||||
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)));
|
||||||
}
|
}
|
||||||
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)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sqlite3_finalize (stmt);
|
sqlite3_finalize(stmt);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::cerr << sqlite3_errmsg(job_data->db) << std::endl;
|
std::cerr << sqlite3_errmsg(job_data->db) << std::endl;
|
||||||
}
|
}
|
||||||
sqlite3_free (query);
|
sqlite3_free(query);
|
||||||
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)
|
||||||
@@ -246,7 +212,7 @@ void pk_backend_search_files(PkBackendJob *job, char **values)
|
|||||||
char *query;
|
char *query;
|
||||||
sqlite3_stmt *stmt;
|
sqlite3_stmt *stmt;
|
||||||
Info ret;
|
Info ret;
|
||||||
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
|
auto job_data = static_cast<JobData *>(pk_backend_job_get_user_data(job));
|
||||||
|
|
||||||
search = g_strjoinv("%", values);
|
search = g_strjoinv("%", values);
|
||||||
|
|
||||||
@@ -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));
|
||||||
}
|
}
|
||||||
@@ -293,7 +259,7 @@ void pk_backend_get_details(PkBackendJob *job, char **package_ids)
|
|||||||
GMatchInfo *match_info;
|
GMatchInfo *match_info;
|
||||||
GError *err = nullptr;
|
GError *err = nullptr;
|
||||||
sqlite3_stmt *stmt;
|
sqlite3_stmt *stmt;
|
||||||
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
|
auto job_data = static_cast<JobData *>(pk_backend_job_get_user_data(job));
|
||||||
|
|
||||||
if ((sqlite3_prepare_v2(job_data->db,
|
if ((sqlite3_prepare_v2(job_data->db,
|
||||||
"SELECT p.desc, p.cat, p.uncompressed FROM pkglist AS p NATURAL JOIN repos AS r "
|
"SELECT p.desc, p.cat, p.uncompressed FROM pkglist AS p NATURAL JOIN repos AS r "
|
||||||
@@ -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 */
|
||||||
@@ -326,7 +293,7 @@ void pk_backend_get_details(PkBackendJob *job, char **package_ids)
|
|||||||
g_error_free(err);
|
g_error_free(err);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
if (g_regex_match(expr, desc->str, (GRegexMatchFlags)0, &match_info))
|
if (g_regex_match(expr, desc->str, (GRegexMatchFlags) 0, &match_info))
|
||||||
{
|
{
|
||||||
homepage = g_match_info_fetch(match_info, 0); /* URL */
|
homepage = g_match_info_fetch(match_info, 0); /* URL */
|
||||||
/* Remove the last sentence with the copied URL */
|
/* Remove the last sentence with the copied URL */
|
||||||
@@ -368,7 +335,7 @@ void pk_backend_resolve(PkBackendJob *job, char **packages)
|
|||||||
char **val;
|
char **val;
|
||||||
sqlite3_stmt *stmt;
|
sqlite3_stmt *stmt;
|
||||||
PkInfoEnum ret;
|
PkInfoEnum ret;
|
||||||
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
|
auto job_data = static_cast<JobData *>(pk_backend_job_get_user_data(job));
|
||||||
|
|
||||||
if ((sqlite3_prepare_v2(job_data->db,
|
if ((sqlite3_prepare_v2(job_data->db,
|
||||||
"SELECT (p1.name || ';' || p1.ver || ';' || p1.arch || ';' || r.repo), p1.summary, "
|
"SELECT (p1.name || ';' || p1.ver || ';' || p1.arch || ';' || r.repo), p1.summary, "
|
||||||
@@ -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));
|
||||||
}
|
}
|
||||||
@@ -415,7 +382,7 @@ void pk_backend_download_packages(PkBackendJob *job, char **package_ids, const c
|
|||||||
char *path, *to_strv[] = {nullptr, nullptr};
|
char *path, *to_strv[] = {nullptr, nullptr};
|
||||||
unsigned i;
|
unsigned i;
|
||||||
sqlite3_stmt *stmt;
|
sqlite3_stmt *stmt;
|
||||||
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
|
auto job_data = static_cast<JobData *>(pk_backend_job_get_user_data(job));
|
||||||
|
|
||||||
if ((sqlite3_prepare_v2(job_data->db,
|
if ((sqlite3_prepare_v2(job_data->db,
|
||||||
"SELECT summary, (full_name || '.' || ext) FROM pkglist NATURAL JOIN repos "
|
"SELECT summary, (full_name || '.' || ext) FROM pkglist NATURAL JOIN repos "
|
||||||
@@ -441,10 +408,7 @@ 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,
|
static_cast<Pkgtools *>(repo->data)->download(job,
|
||||||
package_ids[i],
|
|
||||||
(char *) sqlite3_column_text(stmt, 0));
|
|
||||||
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);
|
||||||
to_strv[0] = path;
|
to_strv[0] = path;
|
||||||
@@ -469,7 +433,7 @@ void pk_backend_install_packages(PkBackendJob *job, char **package_ids)
|
|||||||
GSList *install_list = nullptr, *l;
|
GSList *install_list = nullptr, *l;
|
||||||
sqlite3_stmt *pkglist_stmt = nullptr, *collection_stmt = nullptr;
|
sqlite3_stmt *pkglist_stmt = nullptr, *collection_stmt = nullptr;
|
||||||
PkInfoEnum ret;
|
PkInfoEnum ret;
|
||||||
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
|
auto job_data = static_cast<JobData *>(pk_backend_job_get_user_data(job));
|
||||||
|
|
||||||
if ((sqlite3_prepare_v2(job_data->db,
|
if ((sqlite3_prepare_v2(job_data->db,
|
||||||
"SELECT summary, cat FROM pkglist NATURAL JOIN repos "
|
"SELECT summary, cat FROM pkglist NATURAL JOIN repos "
|
||||||
@@ -548,7 +512,7 @@ void pk_backend_install_packages(PkBackendJob *job, char **package_ids)
|
|||||||
|
|
||||||
if (repo)
|
if (repo)
|
||||||
{
|
{
|
||||||
static_cast<Pkgtools *> (repo->data)->download (job,
|
static_cast<Pkgtools *>(repo->data)->download(job,
|
||||||
dest_dir_name, tokens[PK_PACKAGE_ID_NAME]);
|
dest_dir_name, tokens[PK_PACKAGE_ID_NAME]);
|
||||||
}
|
}
|
||||||
g_strfreev(tokens);
|
g_strfreev(tokens);
|
||||||
@@ -567,7 +531,7 @@ void pk_backend_install_packages(PkBackendJob *job, char **package_ids)
|
|||||||
|
|
||||||
if (repo)
|
if (repo)
|
||||||
{
|
{
|
||||||
static_cast<Pkgtools *> (repo->data)->install (job, tokens[PK_PACKAGE_ID_NAME]);
|
static_cast<Pkgtools *>(repo->data)->install(job, tokens[PK_PACKAGE_ID_NAME]);
|
||||||
}
|
}
|
||||||
g_strfreev(tokens);
|
g_strfreev(tokens);
|
||||||
}
|
}
|
||||||
@@ -623,7 +587,7 @@ void pk_backend_get_updates(PkBackendJob *job)
|
|||||||
GFileInfo *pkg_metadata_file_info;
|
GFileInfo *pkg_metadata_file_info;
|
||||||
GError *err = nullptr;
|
GError *err = nullptr;
|
||||||
sqlite3_stmt *stmt;
|
sqlite3_stmt *stmt;
|
||||||
auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
|
auto job_data = static_cast<JobData *>(pk_backend_job_get_user_data(job));
|
||||||
|
|
||||||
if ((sqlite3_prepare_v2(job_data->db,
|
if ((sqlite3_prepare_v2(job_data->db,
|
||||||
"SELECT p1.full_name, p1.name, p1.ver, p1.arch, r.repo, p1.summary, p1.ext "
|
"SELECT p1.full_name, p1.name, p1.ver, p1.arch, r.repo, p1.summary, p1.ext "
|
||||||
@@ -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);
|
||||||
@@ -829,21 +775,21 @@ void pk_backend_refresh_cache(PkBackendJob *job, bool force)
|
|||||||
for (GSList *l = repos; l; l = g_slist_next(l))
|
for (GSList *l = repos; l; l = g_slist_next(l))
|
||||||
{
|
{
|
||||||
file_list = g_slist_concat(file_list,
|
file_list = g_slist_concat(file_list,
|
||||||
static_cast<Pkgtools *> (l->data)->collect_cache_info (tmp_dir_name));
|
static_cast<Pkgtools *>(l->data)->collect_cache_info(tmp_dir_name));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Download repository */
|
/* Download repository */
|
||||||
for (GSList *l = file_list; l; l = g_slist_next(l))
|
for (GSList *l = file_list; l; l = g_slist_next(l))
|
||||||
{
|
{
|
||||||
get_file(&job_data->curl, static_cast<char **> (l->data)[0],
|
get_file(&job_data->curl, static_cast<char **>(l->data)[0],
|
||||||
static_cast<char **> (l->data)[1]);
|
static_cast<char **>(l->data)[1]);
|
||||||
}
|
}
|
||||||
g_slist_free_full(file_list, (GDestroyNotify)g_strfreev);
|
g_slist_free_full(file_list, (GDestroyNotify) g_strfreev);
|
||||||
|
|
||||||
/* 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
@@ -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);
|
|
||||||
|
|||||||
+16
-32
@@ -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,31 +33,23 @@ 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());
|
||||||
|
|
||||||
if (sqlite3_step(statement) == SQLITE_ROW)
|
if (sqlite3_step(statement) == SQLITE_ROW)
|
||||||
{
|
{
|
||||||
dest_filename = g_build_filename(dest_dir_name, sqlite3_column_text(statement, 1), nullptr);
|
dest_filename = g_build_filename(dest_dir_name, sqlite3_column_text(statement, 1), nullptr);
|
||||||
source_url = g_strconcat(this->get_mirror (),
|
source_url = g_strconcat(this->get_mirror(),
|
||||||
sqlite3_column_text(statement, 0),
|
sqlite3_column_text(statement, 0),
|
||||||
"/",
|
"/",
|
||||||
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;
|
||||||
@@ -97,7 +86,7 @@ Pkgtools::install (JobData *job_data, char *pkg_name) noexcept
|
|||||||
}
|
}
|
||||||
|
|
||||||
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());
|
||||||
|
|
||||||
if (sqlite3_step(statement) == SQLITE_ROW)
|
if (sqlite3_step(statement) == SQLITE_ROW)
|
||||||
{
|
{
|
||||||
@@ -116,7 +105,7 @@ Pkgtools::install (JobData *job_data, char *pkg_name) noexcept
|
|||||||
sqlite3_finalize(statement);
|
sqlite3_finalize(statement);
|
||||||
}
|
}
|
||||||
|
|
||||||
Pkgtools::~Pkgtools () noexcept
|
Pkgtools::~Pkgtools() noexcept
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-11
@@ -14,20 +14,18 @@ namespace katja
|
|||||||
class Pkgtools
|
class Pkgtools
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
const char *get_name () const noexcept;
|
const char *get_name() const noexcept;
|
||||||
const char *get_mirror () const noexcept;
|
const char *get_mirror() const noexcept;
|
||||||
std::uint8_t get_order () const noexcept;
|
std::uint8_t get_order() const noexcept;
|
||||||
bool is_blacklisted (const char *pkg) const noexcept;
|
bool is_blacklisted(const char *pkg) const noexcept;
|
||||||
|
|
||||||
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;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+16
-29
@@ -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,10 +31,9 @@ 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(),
|
||||||
filename,
|
filename,
|
||||||
nullptr);
|
nullptr);
|
||||||
manifest = fopen(path, "rb");
|
manifest = fopen(path, "rb");
|
||||||
@@ -169,19 +167,19 @@ Slackpkg::collect_cache_info (const char *tmpl) noexcept
|
|||||||
|
|
||||||
/* Create the temporary directory for the repository */
|
/* Create the temporary directory for the repository */
|
||||||
tmp_dir = g_file_new_for_path(tmpl);
|
tmp_dir = g_file_new_for_path(tmpl);
|
||||||
repo_tmp_dir = g_file_get_child(tmp_dir, this->get_name ());
|
repo_tmp_dir = g_file_get_child(tmp_dir, this->get_name());
|
||||||
g_file_make_directory(repo_tmp_dir, nullptr, nullptr);
|
g_file_make_directory(repo_tmp_dir, nullptr, nullptr);
|
||||||
|
|
||||||
/* Download PACKAGES.TXT. These files are most important, break if some of them couldn't be found */
|
/* Download PACKAGES.TXT. These files are most important, break if some of them couldn't be found */
|
||||||
for (char **cur_priority = this->priority; *cur_priority; cur_priority++)
|
for (char **cur_priority = this->priority; *cur_priority; cur_priority++)
|
||||||
{
|
{
|
||||||
source_dest = static_cast<char **> (g_malloc_n(3, sizeof(char *)));
|
source_dest = static_cast<char **> (g_malloc_n(3, sizeof(char *)));
|
||||||
source_dest[0] = g_strconcat(this->get_mirror (),
|
source_dest[0] = g_strconcat(this->get_mirror(),
|
||||||
*cur_priority,
|
*cur_priority,
|
||||||
"/PACKAGES.TXT",
|
"/PACKAGES.TXT",
|
||||||
nullptr);
|
nullptr);
|
||||||
source_dest[1] = g_build_filename(tmpl,
|
source_dest[1] = g_build_filename(tmpl,
|
||||||
this->get_name (),
|
this->get_name(),
|
||||||
"PACKAGES.TXT",
|
"PACKAGES.TXT",
|
||||||
nullptr);
|
nullptr);
|
||||||
source_dest[2] = nullptr;
|
source_dest[2] = nullptr;
|
||||||
@@ -199,12 +197,12 @@ Slackpkg::collect_cache_info (const char *tmpl) noexcept
|
|||||||
|
|
||||||
/* Download file lists if available */
|
/* Download file lists if available */
|
||||||
source_dest = static_cast<char **> (g_malloc_n(3, sizeof(char *)));
|
source_dest = static_cast<char **> (g_malloc_n(3, sizeof(char *)));
|
||||||
source_dest[0] = g_strconcat(this->get_mirror (),
|
source_dest[0] = g_strconcat(this->get_mirror(),
|
||||||
*cur_priority,
|
*cur_priority,
|
||||||
"/MANIFEST.bz2",
|
"/MANIFEST.bz2",
|
||||||
nullptr);
|
nullptr);
|
||||||
source_dest[1] = g_strconcat(tmpl,
|
source_dest[1] = g_strconcat(tmpl,
|
||||||
"/", this->get_name (),
|
"/", this->get_name(),
|
||||||
"/", *cur_priority, "-MANIFEST.bz2",
|
"/", *cur_priority, "-MANIFEST.bz2",
|
||||||
nullptr);
|
nullptr);
|
||||||
source_dest[2] = nullptr;
|
source_dest[2] = nullptr;
|
||||||
@@ -239,7 +237,7 @@ out:
|
|||||||
* Returns: List of files needed for building the cache.
|
* Returns: List of files needed for building the cache.
|
||||||
**/
|
**/
|
||||||
void
|
void
|
||||||
Slackpkg::generate_cache (JobData *job_data, const char *tmpl) noexcept
|
Slackpkg::generate_cache(JobData *job_data, const char *tmpl) noexcept
|
||||||
{
|
{
|
||||||
char **pkg_tokens = nullptr;
|
char **pkg_tokens = nullptr;
|
||||||
char *query = nullptr, *filename = nullptr, *location = nullptr, *summary = nullptr, *line, *packages_txt;
|
char *query = nullptr, *filename = nullptr, *location = nullptr, *summary = nullptr, *line, *packages_txt;
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -287,12 +278,8 @@ 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);
|
||||||
|
|
||||||
@@ -320,7 +307,7 @@ Slackpkg::generate_cache (JobData *job_data, const char *tmpl) noexcept
|
|||||||
"ext = @ext, location = @location, summary = @summary, "
|
"ext = @ext, location = @location, summary = @summary, "
|
||||||
"desc = @desc, compressed = @compressed, uncompressed = @uncompressed "
|
"desc = @desc, compressed = @compressed, uncompressed = @uncompressed "
|
||||||
"WHERE name LIKE @name AND repo_order = %u",
|
"WHERE name LIKE @name AND repo_order = %u",
|
||||||
this->get_order ());
|
this->get_order());
|
||||||
if (sqlite3_prepare_v2(job_data->db, query, -1, &update_statement, nullptr) != SQLITE_OK)
|
if (sqlite3_prepare_v2(job_data->db, query, -1, &update_statement, nullptr) != SQLITE_OK)
|
||||||
{
|
{
|
||||||
goto out;
|
goto out;
|
||||||
@@ -392,7 +379,7 @@ Slackpkg::generate_cache (JobData *job_data, const char *tmpl) noexcept
|
|||||||
{
|
{
|
||||||
statement = insert_default_statement;
|
statement = insert_default_statement;
|
||||||
}
|
}
|
||||||
sqlite3_bind_int(statement, 11, this->get_order ());
|
sqlite3_bind_int(statement, 11, this->get_order());
|
||||||
}
|
}
|
||||||
else /* Update package information if it is a patch */
|
else /* Update package information if it is a patch */
|
||||||
{
|
{
|
||||||
@@ -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:
|
||||||
|
|||||||
+2
-3
@@ -20,15 +20,14 @@ public:
|
|||||||
~Slackpkg () noexcept;
|
~Slackpkg () noexcept;
|
||||||
|
|
||||||
GSList *collect_cache_info (const char *tmpl) noexcept;
|
GSList *collect_cache_info (const char *tmpl) noexcept;
|
||||||
void generate_cache (JobData *job_data, const char *tmpl) noexcept;
|
void generate_cache(JobData *job_data, const char *tmpl) noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static GHashTable *cat_map;
|
static GHashTable *cat_map;
|
||||||
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;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+19
-25
@@ -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;
|
||||||
@@ -93,34 +91,34 @@ split_package_name (const char *pkg_filename)
|
|||||||
|
|
||||||
if (pkg_filename[len - 4] == '.')
|
if (pkg_filename[len - 4] == '.')
|
||||||
{
|
{
|
||||||
pkg_tokens = static_cast<char **> (g_malloc_n (6, sizeof (char *)));
|
pkg_tokens = static_cast<char **>(g_malloc_n (6, sizeof (char *)));
|
||||||
|
|
||||||
/* Full name without extension */
|
/* Full name without extension */
|
||||||
len -= 4;
|
len -= 4;
|
||||||
pkg_full_name = g_strndup (pkg_filename, len);
|
pkg_full_name = g_strndup(pkg_filename, len);
|
||||||
pkg_tokens[3] = g_strdup (pkg_full_name);
|
pkg_tokens[3] = g_strdup(pkg_full_name);
|
||||||
|
|
||||||
/* The last 3 characters should be the file extension */
|
/* The last 3 characters should be the file extension */
|
||||||
pkg_tokens[4] = g_strdup (pkg_filename + len + 1);
|
pkg_tokens[4] = g_strdup(pkg_filename + len + 1);
|
||||||
pkg_tokens[5] = nullptr;
|
pkg_tokens[5] = nullptr;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pkg_tokens = static_cast<char **> (g_malloc_n (4, sizeof (char *)));
|
pkg_tokens = static_cast<char **>(g_malloc_n (4, sizeof (char *)));
|
||||||
pkg_full_name = g_strdup (pkg_filename);
|
pkg_full_name = g_strdup(pkg_filename);
|
||||||
pkg_tokens[3] = nullptr;
|
pkg_tokens[3] = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reverse all of the bytes in the package filename to get the name, version and the architecture */
|
/* Reverse all of the bytes in the package filename to get the name, version and the architecture */
|
||||||
g_strreverse (pkg_full_name);
|
g_strreverse (pkg_full_name);
|
||||||
char **reversed_tokens = g_strsplit (pkg_full_name, "-", 4);
|
char **reversed_tokens = g_strsplit(pkg_full_name, "-", 4);
|
||||||
pkg_tokens[0] = g_strreverse (reversed_tokens[3]); /* Name */
|
pkg_tokens[0] = g_strreverse(reversed_tokens[3]); /* Name */
|
||||||
pkg_tokens[1] = g_strreverse (reversed_tokens[2]); /* Version */
|
pkg_tokens[1] = g_strreverse(reversed_tokens[2]); /* Version */
|
||||||
pkg_tokens[2] = g_strreverse (reversed_tokens[1]); /* Architecture */
|
pkg_tokens[2] = g_strreverse(reversed_tokens[1]); /* Architecture */
|
||||||
|
|
||||||
g_free (reversed_tokens[0]); /* Build number */
|
g_free(reversed_tokens[0]); /* Build number */
|
||||||
g_free (reversed_tokens);
|
g_free(reversed_tokens);
|
||||||
g_free (pkg_full_name);
|
g_free(pkg_full_name);
|
||||||
|
|
||||||
return pkg_tokens;
|
return 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,12 +220,11 @@ 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);
|
||||||
|
|
||||||
return g_strcmp0 (repo->get_name (), (char *) b);
|
return g_strcmp0(repo->get_name(), (char *) b);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-5
@@ -24,15 +24,17 @@ 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);
|
||||||
|
|
||||||
char **split_package_name (const char *pkg_filename);
|
char **split_package_name(const char *pkg_filename);
|
||||||
|
|
||||||
Info is_installed (const char *pkg_fullname);
|
Info is_installed(const char *pkg_fullname);
|
||||||
|
|
||||||
int cmp_repo (const void *a, const void *b);
|
int cmp_repo(const void *a, const void *b);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user