4 * Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
34 #include "alpm_list.h"
43 /* Returns a new package cache from db.
44 * It frees the cache if it already exists.
46 int _alpm_db_load_pkgcache(pmdb_t
*db
)
57 _alpm_db_free_pkgcache(db
);
59 _alpm_log(PM_LOG_DEBUG
, _("loading package cache for repository '%s'"),
63 while((info
= _alpm_db_scan(db
, NULL
)) != NULL
) {
64 _alpm_log(PM_LOG_FUNCTION
, _("adding '%s' to package cache for db '%s'"),
65 alpm_pkg_get_name(info
), db
->treename
);
66 info
->origin
= PKG_FROM_CACHE
;
68 /* add to the collection */
69 db
->pkgcache
= alpm_list_add(db
->pkgcache
, info
);
73 db
->pkgcache
= alpm_list_msort(db
->pkgcache
, count
, _alpm_pkg_cmp
);
77 void _alpm_db_free_pkgcache(pmdb_t
*db
)
81 if(db
== NULL
|| db
->pkgcache
== NULL
) {
85 _alpm_log(PM_LOG_DEBUG
, _("freeing package cache for repository '%s'"),
88 FREELISTPKGS(db
->pkgcache
);
91 _alpm_db_free_grpcache(db
);
95 alpm_list_t
*_alpm_db_get_pkgcache(pmdb_t
*db
)
104 _alpm_db_load_pkgcache(db
);
107 /* hmmm, still NULL ?*/
109 _alpm_log(PM_LOG_DEBUG
, _("error: pkgcache is NULL for db '%s'"), db
->treename
);
112 return(db
->pkgcache
);
115 int _alpm_db_add_pkgincache(pmdb_t
*db
, pmpkg_t
*pkg
)
121 if(db
== NULL
|| pkg
== NULL
) {
125 newpkg
= _alpm_pkg_dup(pkg
);
129 _alpm_log(PM_LOG_DEBUG
, _("adding entry '%s' in '%s' cache"),
130 alpm_pkg_get_name(newpkg
), db
->treename
);
131 db
->pkgcache
= alpm_list_add_sorted(db
->pkgcache
, newpkg
, _alpm_pkg_cmp
);
133 _alpm_db_free_grpcache(db
);
138 int _alpm_db_remove_pkgfromcache(pmdb_t
*db
, pmpkg_t
*pkg
)
145 if(db
== NULL
|| pkg
== NULL
) {
149 _alpm_log(PM_LOG_DEBUG
, _("removing entry '%s' from '%s' cache"),
150 alpm_pkg_get_name(pkg
), db
->treename
);
152 db
->pkgcache
= alpm_list_remove(db
->pkgcache
, pkg
, _alpm_pkg_cmp
, &vdata
);
155 /* package not found */
156 _alpm_log(PM_LOG_DEBUG
, _("cannot remove entry '%s' from '%s' cache: not found"),
157 alpm_pkg_get_name(pkg
), db
->treename
);
163 _alpm_db_free_grpcache(db
);
168 pmpkg_t
*_alpm_db_get_pkgfromcache(pmdb_t
*db
, const char *target
)
176 alpm_list_t
*pkgcache
= _alpm_db_get_pkgcache(db
);
178 _alpm_log(PM_LOG_DEBUG
, _("error: failed to get '%s' from NULL pkgcache"), target
);
182 return(_alpm_pkg_find(target
, pkgcache
));
185 /* Returns a new group cache from db.
187 int _alpm_db_load_grpcache(pmdb_t
*db
)
197 if(db
->pkgcache
== NULL
) {
198 _alpm_db_load_pkgcache(db
);
201 _alpm_log(PM_LOG_DEBUG
, _("loading group cache for repository '%s'"), db
->treename
);
203 for(lp
= _alpm_db_get_pkgcache(db
); lp
; lp
= lp
->next
) {
205 pmpkg_t
*pkg
= lp
->data
;
207 for(i
= alpm_pkg_get_groups(pkg
); i
; i
= i
->next
) {
208 if(!alpm_list_find_str(db
->grpcache
, i
->data
)) {
209 pmgrp_t
*grp
= _alpm_grp_new();
211 strncpy(grp
->name
, i
->data
, GRP_NAME_LEN
);
212 grp
->name
[GRP_NAME_LEN
-1] = '\0';
213 grp
->packages
= alpm_list_add_sorted(grp
->packages
,
214 /* gross signature forces us to
216 (void*)alpm_pkg_get_name(pkg
),
218 db
->grpcache
= alpm_list_add_sorted(db
->grpcache
, grp
, _alpm_grp_cmp
);
222 for(j
= db
->grpcache
; j
; j
= j
->next
) {
223 pmgrp_t
*grp
= j
->data
;
225 if(strcmp(grp
->name
, i
->data
) == 0) {
226 const char *pkgname
= alpm_pkg_get_name(pkg
);
227 if(!alpm_list_find_str(grp
->packages
, pkgname
)) {
228 grp
->packages
= alpm_list_add_sorted(grp
->packages
,
241 void _alpm_db_free_grpcache(pmdb_t
*db
)
247 if(db
== NULL
|| db
->grpcache
== NULL
) {
251 for(lg
= db
->grpcache
; lg
; lg
= lg
->next
) {
252 pmgrp_t
*grp
= lg
->data
;
254 FREELISTPTR(grp
->packages
);
257 FREELIST(db
->grpcache
);
260 alpm_list_t
*_alpm_db_get_grpcache(pmdb_t
*db
)
268 if(db
->grpcache
== NULL
) {
269 _alpm_db_load_grpcache(db
);
272 return(db
->grpcache
);
275 pmgrp_t
*_alpm_db_get_grpfromcache(pmdb_t
*db
, const char *target
)
281 if(db
== NULL
|| target
== NULL
|| strlen(target
) == 0) {
285 for(i
= _alpm_db_get_grpcache(db
); i
; i
= i
->next
) {
286 pmgrp_t
*info
= i
->data
;
288 if(strcmp(info
->name
, target
) == 0) {
296 /* vim: set ts=2 sw=2 noet: */