00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "config.h"
00021
00022 #include <unistd.h>
00023 #include <stdio.h>
00024 #include <stdlib.h>
00025 #include <errno.h>
00026 #include <string.h>
00027
00028
00029 #include "cache.h"
00030 #include "alpm_list.h"
00031 #include "log.h"
00032 #include "alpm.h"
00033 #include "util.h"
00034 #include "error.h"
00035 #include "package.h"
00036 #include "group.h"
00037 #include "db.h"
00038
00039
00040
00041
00042 int _alpm_db_load_pkgcache(pmdb_t *db)
00043 {
00044 pmpkg_t *info;
00045 int count = 0;
00046
00047 ALPM_LOG_FUNC;
00048
00049 if(db == NULL) {
00050 return(-1);
00051 }
00052
00053 _alpm_db_free_pkgcache(db);
00054
00055 _alpm_log(PM_LOG_DEBUG, "loading package cache for repository '%s'\n",
00056 db->treename);
00057
00058 _alpm_db_rewind(db);
00059 while((info = _alpm_db_scan(db, NULL)) != NULL) {
00060 _alpm_log(PM_LOG_FUNCTION, "adding '%s' to package cache for db '%s'\n",
00061 alpm_pkg_get_name(info), db->treename);
00062 info->origin = PKG_FROM_CACHE;
00063 info->origin_data.db = db;
00064
00065 db->pkgcache = alpm_list_add(db->pkgcache, info);
00066 count++;
00067 }
00068
00069 db->pkgcache = alpm_list_msort(db->pkgcache, count, _alpm_pkg_cmp);
00070 return(0);
00071 }
00072
00073 void _alpm_db_free_pkgcache(pmdb_t *db)
00074 {
00075 ALPM_LOG_FUNC;
00076
00077 if(db == NULL || db->pkgcache == NULL) {
00078 return;
00079 }
00080
00081 _alpm_log(PM_LOG_DEBUG, "freeing package cache for repository '%s'\n",
00082 db->treename);
00083
00084 alpm_list_t *tmp;
00085 for(tmp = db->pkgcache; tmp; tmp = alpm_list_next(tmp)) {
00086 _alpm_pkg_free(tmp->data);
00087 }
00088 alpm_list_free(db->pkgcache);
00089 db->pkgcache = NULL;
00090
00091 if(db->grpcache) {
00092 _alpm_db_free_grpcache(db);
00093 }
00094 }
00095
00096 alpm_list_t *_alpm_db_get_pkgcache(pmdb_t *db)
00097 {
00098 ALPM_LOG_FUNC;
00099
00100 if(db == NULL) {
00101 return(NULL);
00102 }
00103
00104 if(!db->pkgcache) {
00105 _alpm_db_load_pkgcache(db);
00106 }
00107
00108
00109 if(!db->pkgcache) {
00110 _alpm_log(PM_LOG_DEBUG, "error: pkgcache is NULL for db '%s'\n", db->treename);
00111 }
00112
00113 return(db->pkgcache);
00114 }
00115
00116 int _alpm_db_add_pkgincache(pmdb_t *db, pmpkg_t *pkg)
00117 {
00118 pmpkg_t *newpkg;
00119
00120 ALPM_LOG_FUNC;
00121
00122 if(db == NULL || pkg == NULL) {
00123 return(-1);
00124 }
00125
00126 newpkg = _alpm_pkg_dup(pkg);
00127 if(newpkg == NULL) {
00128 return(-1);
00129 }
00130 _alpm_log(PM_LOG_DEBUG, "adding entry '%s' in '%s' cache\n",
00131 alpm_pkg_get_name(newpkg), db->treename);
00132 db->pkgcache = alpm_list_add_sorted(db->pkgcache, newpkg, _alpm_pkg_cmp);
00133
00134 _alpm_db_free_grpcache(db);
00135
00136 return(0);
00137 }
00138
00139 int _alpm_db_remove_pkgfromcache(pmdb_t *db, pmpkg_t *pkg)
00140 {
00141 void *vdata;
00142 pmpkg_t *data;
00143
00144 ALPM_LOG_FUNC;
00145
00146 if(db == NULL || pkg == NULL) {
00147 return(-1);
00148 }
00149
00150 _alpm_log(PM_LOG_DEBUG, "removing entry '%s' from '%s' cache\n",
00151 alpm_pkg_get_name(pkg), db->treename);
00152
00153 db->pkgcache = alpm_list_remove(db->pkgcache, pkg, _alpm_pkg_cmp, &vdata);
00154 data = vdata;
00155 if(data == NULL) {
00156
00157 _alpm_log(PM_LOG_DEBUG, "cannot remove entry '%s' from '%s' cache: not found\n",
00158 alpm_pkg_get_name(pkg), db->treename);
00159 return(-1);
00160 }
00161
00162 _alpm_pkg_free(data);
00163
00164 _alpm_db_free_grpcache(db);
00165
00166 return(0);
00167 }
00168
00169 pmpkg_t *_alpm_db_get_pkgfromcache(pmdb_t *db, const char *target)
00170 {
00171 ALPM_LOG_FUNC;
00172
00173 if(db == NULL) {
00174 return(NULL);
00175 }
00176
00177 alpm_list_t *pkgcache = _alpm_db_get_pkgcache(db);
00178 if(!pkgcache) {
00179 _alpm_log(PM_LOG_DEBUG, "error: failed to get '%s' from NULL pkgcache\n",
00180 target);
00181 return(NULL);
00182 }
00183
00184 return(_alpm_pkg_find(target, pkgcache));
00185 }
00186
00187
00188
00189 int _alpm_db_load_grpcache(pmdb_t *db)
00190 {
00191 alpm_list_t *lp;
00192
00193 ALPM_LOG_FUNC;
00194
00195 if(db == NULL) {
00196 return(-1);
00197 }
00198
00199 if(db->pkgcache == NULL) {
00200 _alpm_db_load_pkgcache(db);
00201 }
00202
00203 _alpm_log(PM_LOG_DEBUG, "loading group cache for repository '%s'\n",
00204 db->treename);
00205
00206 for(lp = _alpm_db_get_pkgcache(db); lp; lp = lp->next) {
00207 const alpm_list_t *i;
00208 pmpkg_t *pkg = lp->data;
00209
00210 for(i = alpm_pkg_get_groups(pkg); i; i = i->next) {
00211 if(!alpm_list_find_str(db->grpcache, i->data)) {
00212 pmgrp_t *grp = _alpm_grp_new();
00213
00214 strncpy(grp->name, i->data, GRP_NAME_LEN);
00215 grp->name[GRP_NAME_LEN-1] = '\0';
00216 grp->packages = alpm_list_add_sorted(grp->packages,
00217
00218
00219 (void*)alpm_pkg_get_name(pkg),
00220 _alpm_str_cmp);
00221 db->grpcache = alpm_list_add_sorted(db->grpcache, grp, _alpm_grp_cmp);
00222 } else {
00223 alpm_list_t *j;
00224
00225 for(j = db->grpcache; j; j = j->next) {
00226 pmgrp_t *grp = j->data;
00227
00228 if(strcmp(grp->name, i->data) == 0) {
00229 const char *pkgname = alpm_pkg_get_name(pkg);
00230 if(!alpm_list_find_str(grp->packages, pkgname)) {
00231 grp->packages = alpm_list_add_sorted(grp->packages,
00232 (void*)pkgname,
00233 _alpm_str_cmp);
00234 }
00235 }
00236 }
00237 }
00238 }
00239 }
00240
00241 return(0);
00242 }
00243
00244 void _alpm_db_free_grpcache(pmdb_t *db)
00245 {
00246 alpm_list_t *lg;
00247
00248 ALPM_LOG_FUNC;
00249
00250 if(db == NULL || db->grpcache == NULL) {
00251 return;
00252 }
00253
00254 for(lg = db->grpcache; lg; lg = lg->next) {
00255 pmgrp_t *grp = lg->data;
00256
00257 alpm_list_free(grp->packages);
00258 grp->packages = NULL;
00259 _alpm_grp_free(lg->data);
00260 lg->data = NULL;
00261 }
00262 FREELIST(db->grpcache);
00263 }
00264
00265 alpm_list_t *_alpm_db_get_grpcache(pmdb_t *db)
00266 {
00267 ALPM_LOG_FUNC;
00268
00269 if(db == NULL) {
00270 return(NULL);
00271 }
00272
00273 if(db->grpcache == NULL) {
00274 _alpm_db_load_grpcache(db);
00275 }
00276
00277 return(db->grpcache);
00278 }
00279
00280 pmgrp_t *_alpm_db_get_grpfromcache(pmdb_t *db, const char *target)
00281 {
00282 alpm_list_t *i;
00283
00284 ALPM_LOG_FUNC;
00285
00286 if(db == NULL || target == NULL || strlen(target) == 0) {
00287 return(NULL);
00288 }
00289
00290 for(i = _alpm_db_get_grpcache(db); i; i = i->next) {
00291 pmgrp_t *info = i->data;
00292
00293 if(strcmp(info->name, target) == 0) {
00294 return(info);
00295 }
00296 }
00297
00298 return(NULL);
00299 }
00300
00301