This repository has been archived by the owner on Aug 15, 2021. It is now read-only.
/
low-repo-sqlite.c
126 lines (110 loc) · 4.09 KB
/
low-repo-sqlite.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
* Low: a yum-like package manager
*
* Copyright (C) 2008 James Bowes <jbowes@dangerouslyinc.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
#include <stdlib.h>
#include <stdio.h>
#include <sqlite3.h>
#include "low-package-sqlite.h"
#include "low-repo-sqlite.h"
typedef struct _LowRepoSqlite {
LowRepo super;
sqlite3 *db;
} LowRepoSqlite;
LowRepo *
low_repo_sqlite_initialize (const char *id, const char *name, gboolean enabled)
{
LowRepoSqlite *repo = malloc (sizeof (LowRepoSqlite));
char *primary_db = g_strdup_printf ("/var/cache/yum/%s/primary.sqlite", id);
if (sqlite3_open (primary_db, &repo->db)) {
// fprintf (stderr, "Can't open database '%s': %s\n",
// primary_db, sqlite3_errmsg (repo->db));
sqlite3_close (repo->db);
// exit(1);
}
repo->super.id = g_strdup (id);
repo->super.name = g_strdup (name);
repo->super.enabled = enabled;
return (LowRepo *) repo;
}
void
low_repo_sqlite_shutdown (LowRepo *repo)
{
LowRepoSqlite *repo_sqlite = (LowRepoSqlite *) repo;
sqlite3_close (repo_sqlite->db);
free (repo);
}
LowPackageIter *
low_repo_sqlite_list_all (LowRepo *repo)
{
const char *stmt = "SELECT name, arch, version, release, size_package,"
"summary, description, url, rpm_license FROM packages";
LowRepoSqlite *repo_sqlite = (LowRepoSqlite *) repo;
LowPackageIterSqlite *iter = malloc (sizeof (LowPackageIterSqlite));
iter->super.repo = repo;
iter->super.pkg = NULL;
sqlite3_prepare (repo_sqlite->db, stmt, -1, &iter->pp_stmt, NULL);
return (LowPackageIter *) iter;
}
LowPackageIter *
low_repo_sqlite_list_by_name (LowRepo *repo, const char *name)
{
const char *stmt = "SELECT name, arch, version, release, size_package, "
"summary, description, url, rpm_license "
"FROM packages "
"WHERE name = :name";
LowRepoSqlite *repo_sqlite = (LowRepoSqlite *) repo;
LowPackageIterSqlite *iter = malloc (sizeof (LowPackageIterSqlite));
iter->super.repo = repo;
iter->super.pkg = NULL;
sqlite3_prepare (repo_sqlite->db, stmt, -1, &iter->pp_stmt, NULL);
sqlite3_bind_text (iter->pp_stmt, 1, name, -1, SQLITE_STATIC);
return (LowPackageIter *) iter;
}
LowPackageIter *
low_repo_sqlite_search_provides (LowRepo *repo, const char *provides)
{
const char *stmt = "SELECT p.name, p.arch, p.version, p.release, "
"p.size_package, p.summary, p.description, p.url, "
"p.rpm_license FROM packages p, provides pr "
"WHERE pr.pkgKey = p.pkgKey AND pr.name = :provides";
LowRepoSqlite *repo_sqlite = (LowRepoSqlite *) repo;
LowPackageIterSqlite *iter = malloc (sizeof (LowPackageIterSqlite));
iter->super.repo = repo;
iter->super.pkg = NULL;
sqlite3_prepare (repo_sqlite->db, stmt, -1, &iter->pp_stmt, NULL);
sqlite3_bind_text (iter->pp_stmt, 1, provides, -1, SQLITE_STATIC);
return (LowPackageIter *) iter;
}
LowPackageIter *
low_repo_sqlite_search_requires (LowRepo *repo, const char *requires)
{
const char *stmt = "SELECT p.name, p.arch, p.version, p.release, "
"p.size_package, p.summary, p.description, p.url, "
"p.rpm_license FROM packages p, requires req "
"WHERE req.pkgKey = p.pkgKey "
"AND req.name = :requires";
LowRepoSqlite *repo_sqlite = (LowRepoSqlite *) repo;
LowPackageIterSqlite *iter = malloc (sizeof (LowPackageIterSqlite));
iter->super.repo = repo;
iter->super.pkg = NULL;
sqlite3_prepare (repo_sqlite->db, stmt, -1, &iter->pp_stmt, NULL);
sqlite3_bind_text (iter->pp_stmt, 1, requires, -1, SQLITE_STATIC);
return (LowPackageIter *) iter;
}