- db_write: add support to write both local and sync entries
- code cleanup
This commit is contained in:
parent
dc0bacf18c
commit
58a7e85534
8 changed files with 103 additions and 58 deletions
|
@ -161,6 +161,8 @@ int alpm_get_option(unsigned char parm, long *data)
|
||||||
*/
|
*/
|
||||||
pmdb_t *alpm_db_register(char *treename)
|
pmdb_t *alpm_db_register(char *treename)
|
||||||
{
|
{
|
||||||
|
char path[PATH_MAX];
|
||||||
|
struct stat buf;
|
||||||
pmdb_t *db;
|
pmdb_t *db;
|
||||||
int found = 0;
|
int found = 0;
|
||||||
|
|
||||||
|
@ -187,7 +189,15 @@ pmdb_t *alpm_db_register(char *treename)
|
||||||
RET_ERR(PM_ERR_DB_NOT_NULL, NULL);
|
RET_ERR(PM_ERR_DB_NOT_NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
db = db_open(handle->root, handle->dbpath, treename, DB_O_CREATE);
|
/* make sure the database directory exists */
|
||||||
|
snprintf(path, PATH_MAX, "%s%s", handle->root, handle->dbpath);
|
||||||
|
if(stat(path, &buf) != 0 || !S_ISDIR(buf.st_mode)) {
|
||||||
|
if(_alpm_makepath(path) != 0) {
|
||||||
|
RET_ERR(PM_ERR_SYSTEM, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
db = db_open(path, treename, DB_O_CREATE);
|
||||||
if(db == NULL) {
|
if(db == NULL) {
|
||||||
RET_ERR(PM_ERR_DB_OPEN, NULL);
|
RET_ERR(PM_ERR_DB_OPEN, NULL);
|
||||||
}
|
}
|
||||||
|
|
109
lib/libalpm/db.c
109
lib/libalpm/db.c
|
@ -38,11 +38,11 @@
|
||||||
#include "alpm.h"
|
#include "alpm.h"
|
||||||
|
|
||||||
/* Open a database and return a pmdb_t handle */
|
/* Open a database and return a pmdb_t handle */
|
||||||
pmdb_t *db_open(char *root, char *dbpath, char *treename, int mode)
|
pmdb_t *db_open(char *dbpath, char *treename, int mode)
|
||||||
{
|
{
|
||||||
pmdb_t *db;
|
pmdb_t *db;
|
||||||
|
|
||||||
if(root == NULL || dbpath == NULL || treename == NULL) {
|
if(dbpath == NULL || treename == NULL) {
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,14 +50,14 @@ pmdb_t *db_open(char *root, char *dbpath, char *treename, int mode)
|
||||||
|
|
||||||
MALLOC(db, sizeof(pmdb_t));
|
MALLOC(db, sizeof(pmdb_t));
|
||||||
|
|
||||||
MALLOC(db->path, strlen(root)+strlen(dbpath)+strlen(treename)+2);
|
MALLOC(db->path, strlen(dbpath)+strlen(treename)+2);
|
||||||
sprintf(db->path, "%s%s/%s", root, dbpath, treename);
|
sprintf(db->path, "%s/%s", dbpath, treename);
|
||||||
|
|
||||||
db->dir = opendir(db->path);
|
db->dir = opendir(db->path);
|
||||||
if(db->dir == NULL) {
|
if(db->dir == NULL) {
|
||||||
if(mode & DB_O_CREATE) {
|
if(mode & DB_O_CREATE) {
|
||||||
_alpm_log(PM_LOG_WARNING, "could not open database '%s' -- try creating it", treename);
|
_alpm_log(PM_LOG_WARNING, "could not open database '%s' -- try creating it", treename);
|
||||||
if(_alpm_makepath(db->path) == 0) {
|
if(mkdir(db->path, 0755) == 0) {
|
||||||
db->dir = opendir(db->path);
|
db->dir = opendir(db->path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -394,6 +394,7 @@ int db_write(pmdb_t *db, pmpkg_t *info, unsigned int inforeq)
|
||||||
mode_t oldmask;
|
mode_t oldmask;
|
||||||
PMList *lp = NULL;
|
PMList *lp = NULL;
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
|
int local = 0;
|
||||||
|
|
||||||
if(db == NULL || info == NULL) {
|
if(db == NULL || info == NULL) {
|
||||||
return(-1);
|
return(-1);
|
||||||
|
@ -405,6 +406,10 @@ int db_write(pmdb_t *db, pmpkg_t *info, unsigned int inforeq)
|
||||||
/* make sure we have a sane umask */
|
/* make sure we have a sane umask */
|
||||||
umask(0022);
|
umask(0022);
|
||||||
|
|
||||||
|
if(strcmp(db->treename, "local") == 0) {
|
||||||
|
local = 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* DESC */
|
/* DESC */
|
||||||
if(inforeq & INFRQ_DESC) {
|
if(inforeq & INFRQ_DESC) {
|
||||||
snprintf(path, PATH_MAX, "%s/desc", topdir);
|
snprintf(path, PATH_MAX, "%s/desc", topdir);
|
||||||
|
@ -426,47 +431,58 @@ int db_write(pmdb_t *db, pmpkg_t *info, unsigned int inforeq)
|
||||||
}
|
}
|
||||||
fprintf(fp, "\n");
|
fprintf(fp, "\n");
|
||||||
}
|
}
|
||||||
if(info->url[0]) {
|
if(local) {
|
||||||
fprintf(fp, "%%URL%%\n"
|
if(info->url[0]) {
|
||||||
"%s\n\n", info->url);
|
fprintf(fp, "%%URL%%\n"
|
||||||
}
|
"%s\n\n", info->url);
|
||||||
if(info->license) {
|
}
|
||||||
fputs("%LICENSE%\n", fp);
|
if(info->license) {
|
||||||
for(lp = info->license; lp; lp = lp->next) {
|
fputs("%LICENSE%\n", fp);
|
||||||
fprintf(fp, "%s\n", (char *)lp->data);
|
for(lp = info->license; lp; lp = lp->next) {
|
||||||
|
fprintf(fp, "%s\n", (char *)lp->data);
|
||||||
|
}
|
||||||
|
fprintf(fp, "\n");
|
||||||
|
}
|
||||||
|
if(info->arch[0]) {
|
||||||
|
fprintf(fp, "%%ARCH%%\n"
|
||||||
|
"%s\n\n", info->arch);
|
||||||
|
}
|
||||||
|
if(info->builddate[0]) {
|
||||||
|
fprintf(fp, "%%BUILDDATE%%\n"
|
||||||
|
"%s\n\n", info->builddate);
|
||||||
|
}
|
||||||
|
if(info->installdate[0]) {
|
||||||
|
fprintf(fp, "%%INSTALLDATE%%\n"
|
||||||
|
"%s\n\n", info->installdate);
|
||||||
|
}
|
||||||
|
if(info->packager[0]) {
|
||||||
|
fprintf(fp, "%%PACKAGER%%\n"
|
||||||
|
"%s\n\n", info->packager);
|
||||||
|
}
|
||||||
|
if(info->size) {
|
||||||
|
fprintf(fp, "%%SIZE%%\n"
|
||||||
|
"%ld\n\n", info->size);
|
||||||
|
}
|
||||||
|
if(info->reason) {
|
||||||
|
fprintf(fp, "%%REASON%%\n"
|
||||||
|
"%d\n\n", info->reason);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(info->size) {
|
||||||
|
fprintf(fp, "%%CSIZE%%\n"
|
||||||
|
"%ld\n\n", info->size);
|
||||||
|
}
|
||||||
|
if(info->reason) {
|
||||||
|
fprintf(fp, "%%MD5SUM%%\n"
|
||||||
|
"%s\n\n", info->md5sum);
|
||||||
}
|
}
|
||||||
fprintf(fp, "\n");
|
|
||||||
}
|
|
||||||
if(info->arch[0]) {
|
|
||||||
fprintf(fp, "%%ARCH%%\n"
|
|
||||||
"%s\n\n", info->arch);
|
|
||||||
}
|
|
||||||
if(info->builddate[0]) {
|
|
||||||
fprintf(fp, "%%BUILDDATE%%\n"
|
|
||||||
"%s\n\n", info->builddate);
|
|
||||||
}
|
|
||||||
if(info->installdate[0]) {
|
|
||||||
fprintf(fp, "%%INSTALLDATE%%\n"
|
|
||||||
"%s\n\n", info->installdate);
|
|
||||||
}
|
|
||||||
if(info->packager[0]) {
|
|
||||||
fprintf(fp, "%%PACKAGER%%\n"
|
|
||||||
"%s\n\n", info->packager);
|
|
||||||
}
|
|
||||||
if(info->size) {
|
|
||||||
fprintf(fp, "%%SIZE%%\n"
|
|
||||||
"%ld\n\n", info->size);
|
|
||||||
}
|
|
||||||
if(info->reason) {
|
|
||||||
fprintf(fp, "%%REASON%%\n"
|
|
||||||
"%d\n\n", info->reason);
|
|
||||||
}
|
}
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
fp = NULL;
|
fp = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FILES */
|
/* FILES */
|
||||||
if(inforeq & INFRQ_FILES) {
|
if(local && inforeq & INFRQ_FILES) {
|
||||||
snprintf(path, PATH_MAX, "%s/files", topdir);
|
snprintf(path, PATH_MAX, "%s/files", topdir);
|
||||||
if((fp = fopen(path, "w")) == NULL) {
|
if((fp = fopen(path, "w")) == NULL) {
|
||||||
_alpm_log(PM_LOG_ERROR, "db_write: could not open file %s/files", db->treename);
|
_alpm_log(PM_LOG_ERROR, "db_write: could not open file %s/files", db->treename);
|
||||||
|
@ -506,7 +522,7 @@ int db_write(pmdb_t *db, pmpkg_t *info, unsigned int inforeq)
|
||||||
}
|
}
|
||||||
fprintf(fp, "\n");
|
fprintf(fp, "\n");
|
||||||
}
|
}
|
||||||
if(info->requiredby) {
|
if(local && info->requiredby) {
|
||||||
fputs("%REQUIREDBY%\n", fp);
|
fputs("%REQUIREDBY%\n", fp);
|
||||||
for(lp = info->requiredby; lp; lp = lp->next) {
|
for(lp = info->requiredby; lp; lp = lp->next) {
|
||||||
fprintf(fp, "%s\n", (char *)lp->data);
|
fprintf(fp, "%s\n", (char *)lp->data);
|
||||||
|
@ -527,6 +543,19 @@ int db_write(pmdb_t *db, pmpkg_t *info, unsigned int inforeq)
|
||||||
}
|
}
|
||||||
fprintf(fp, "\n");
|
fprintf(fp, "\n");
|
||||||
}
|
}
|
||||||
|
if(!local) {
|
||||||
|
if(info->replaces) {
|
||||||
|
fputs("%REPLACES%\n", fp);
|
||||||
|
for(lp = info->replaces; lp; lp = lp->next) {
|
||||||
|
fprintf(fp, "%s\n", (char *)lp->data);
|
||||||
|
}
|
||||||
|
fprintf(fp, "\n");
|
||||||
|
}
|
||||||
|
if(info->force) {
|
||||||
|
fprintf(fp, "%%FORCE%%\n"
|
||||||
|
"\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
fp = NULL;
|
fp = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,9 +47,8 @@ typedef struct __pmdb_t {
|
||||||
PMList *grpcache;
|
PMList *grpcache;
|
||||||
} pmdb_t;
|
} pmdb_t;
|
||||||
|
|
||||||
pmdb_t *db_open(char *root, char *dbpath, char *treename, int mode);
|
pmdb_t *db_open(char *path, char *treename, int mode);
|
||||||
void db_close(pmdb_t *db);
|
void db_close(pmdb_t *db);
|
||||||
|
|
||||||
void db_rewind(pmdb_t *db);
|
void db_rewind(pmdb_t *db);
|
||||||
pmpkg_t *db_scan(pmdb_t *db, char *target, unsigned int inforeq);
|
pmpkg_t *db_scan(pmdb_t *db, char *target, unsigned int inforeq);
|
||||||
int db_read(pmdb_t *db, char *name, unsigned int inforeq, pmpkg_t *info);
|
int db_read(pmdb_t *db, char *name, unsigned int inforeq, pmpkg_t *info);
|
||||||
|
|
|
@ -208,16 +208,16 @@ int pm_list_is_in(void *needle, PMList *haystack)
|
||||||
|
|
||||||
/* Test for existence of a string in a PMList
|
/* Test for existence of a string in a PMList
|
||||||
*/
|
*/
|
||||||
PMList *pm_list_is_strin(char *needle, PMList *haystack)
|
int pm_list_is_strin(char *needle, PMList *haystack)
|
||||||
{
|
{
|
||||||
PMList *lp;
|
PMList *lp;
|
||||||
|
|
||||||
for(lp = haystack; lp; lp = lp->next) {
|
for(lp = haystack; lp; lp = lp->next) {
|
||||||
if(lp->data && !strcmp(lp->data, needle)) {
|
if(lp->data && !strcmp(lp->data, needle)) {
|
||||||
return(lp);
|
return(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return(NULL);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
PMList *_alpm_list_last(PMList *list)
|
PMList *_alpm_list_last(PMList *list)
|
||||||
|
|
|
@ -50,7 +50,7 @@ PMList *pm_list_add_sorted(PMList *list, void *data, pm_fn_cmp fn);
|
||||||
PMList *_alpm_list_remove(PMList *haystack, void *needle, pm_fn_cmp fn, void **data);
|
PMList *_alpm_list_remove(PMList *haystack, void *needle, pm_fn_cmp fn, void **data);
|
||||||
int _alpm_list_count(PMList *list);
|
int _alpm_list_count(PMList *list);
|
||||||
int pm_list_is_in(void *needle, PMList *haystack);
|
int pm_list_is_in(void *needle, PMList *haystack);
|
||||||
PMList *pm_list_is_strin(char *needle, PMList *haystack);
|
int pm_list_is_strin(char *needle, PMList *haystack);
|
||||||
PMList *_alpm_list_last(PMList *list);
|
PMList *_alpm_list_last(PMList *list);
|
||||||
PMList *_alpm_list_remove_dupes(PMList *list);
|
PMList *_alpm_list_remove_dupes(PMList *list);
|
||||||
PMList *_alpm_list_reverse(PMList *list);
|
PMList *_alpm_list_reverse(PMList *list);
|
||||||
|
|
|
@ -33,14 +33,14 @@ unsigned char pm_logmask = 0;
|
||||||
|
|
||||||
void _alpm_log(unsigned char flag, char *fmt, ...)
|
void _alpm_log(unsigned char flag, char *fmt, ...)
|
||||||
{
|
{
|
||||||
char str[LOG_STR_LEN];
|
|
||||||
va_list args;
|
|
||||||
|
|
||||||
if(pm_logcb == NULL) {
|
if(pm_logcb == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(flag & pm_logmask) {
|
if(flag & pm_logmask) {
|
||||||
|
char str[LOG_STR_LEN];
|
||||||
|
va_list args;
|
||||||
|
|
||||||
va_start(args, fmt);
|
va_start(args, fmt);
|
||||||
vsnprintf(str, LOG_STR_LEN, fmt, args);
|
vsnprintf(str, LOG_STR_LEN, fmt, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
|
@ -149,7 +149,7 @@ void pkg_free(pmpkg_t *pkg)
|
||||||
static int parse_descfile(char *descfile, pmpkg_t *info, int output)
|
static int parse_descfile(char *descfile, pmpkg_t *info, int output)
|
||||||
{
|
{
|
||||||
FILE* fp = NULL;
|
FILE* fp = NULL;
|
||||||
char line[PATH_MAX+1];
|
char line[PATH_MAX];
|
||||||
char* ptr = NULL;
|
char* ptr = NULL;
|
||||||
char* key = NULL;
|
char* key = NULL;
|
||||||
int linenum = 0;
|
int linenum = 0;
|
||||||
|
|
|
@ -299,8 +299,7 @@ int sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, char *n
|
||||||
}
|
}
|
||||||
_alpm_log(PM_LOG_DEBUG, "found '%s' as a provision for '%s'", p->data, targ);
|
_alpm_log(PM_LOG_DEBUG, "found '%s' as a provision for '%s'", p->data, targ);
|
||||||
spkg = db_get_pkgfromcache(dbs, p->data);
|
spkg = db_get_pkgfromcache(dbs, p->data);
|
||||||
p->data = NULL;
|
FREELISTPTR(p);
|
||||||
FREELIST(p);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -319,8 +318,7 @@ int sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, char *n
|
||||||
if(p) {
|
if(p) {
|
||||||
_alpm_log(PM_LOG_DEBUG, "found '%s' as a provision for '%s'", p->data, targ);
|
_alpm_log(PM_LOG_DEBUG, "found '%s' as a provision for '%s'", p->data, targ);
|
||||||
spkg = db_get_pkgfromcache(dbs, p->data);
|
spkg = db_get_pkgfromcache(dbs, p->data);
|
||||||
p->data = NULL;
|
FREELISTPTR(p);
|
||||||
FREELIST(p);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -416,6 +414,9 @@ int sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PMList **
|
||||||
pmpkg_t *spkg = i->data;
|
pmpkg_t *spkg = i->data;
|
||||||
if(!find_pkginsync(spkg->name, trans->packages)) {
|
if(!find_pkginsync(spkg->name, trans->packages)) {
|
||||||
pmsyncpkg_t *sync = sync_new(PM_SYNC_TYPE_DEPEND, spkg, NULL);
|
pmsyncpkg_t *sync = sync_new(PM_SYNC_TYPE_DEPEND, spkg, NULL);
|
||||||
|
if(sync == NULL) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
trans->packages = pm_list_add(trans->packages, sync);
|
trans->packages = pm_list_add(trans->packages, sync);
|
||||||
_alpm_log(PM_LOG_FLOW2, "adding package %s-%s to the transaction targets",
|
_alpm_log(PM_LOG_FLOW2, "adding package %s-%s to the transaction targets",
|
||||||
spkg->name, spkg->version);
|
spkg->name, spkg->version);
|
||||||
|
@ -484,7 +485,7 @@ int sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PMList **
|
||||||
* (not the same behavior as in pacman 2.x) */
|
* (not the same behavior as in pacman 2.x) */
|
||||||
} else {
|
} else {
|
||||||
char *rmpkg = NULL;
|
char *rmpkg = NULL;
|
||||||
char *target, *depend;
|
int target, depend;
|
||||||
/* hmmm, depend.name isn't installed, so it must be conflicting
|
/* hmmm, depend.name isn't installed, so it must be conflicting
|
||||||
* with another package in our final list. For example:
|
* with another package in our final list. For example:
|
||||||
*
|
*
|
||||||
|
@ -498,8 +499,8 @@ int sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PMList **
|
||||||
|
|
||||||
/* figure out which one was requested in targets. If they both were,
|
/* figure out which one was requested in targets. If they both were,
|
||||||
* then it's still an unresolvable conflict. */
|
* then it's still an unresolvable conflict. */
|
||||||
target = pm_list_is_strin(miss->target, trans->targets) ? miss->target : NULL;
|
target = pm_list_is_strin(miss->target, trans->targets);
|
||||||
depend = pm_list_is_strin(miss->depend.name, trans->targets) ? miss->depend.name : NULL;
|
depend = pm_list_is_strin(miss->depend.name, trans->targets);
|
||||||
if(depend && !target) {
|
if(depend && !target) {
|
||||||
_alpm_log(PM_LOG_DEBUG, "'%s' is in the target list -- keeping it",
|
_alpm_log(PM_LOG_DEBUG, "'%s' is in the target list -- keeping it",
|
||||||
miss->depend.name);
|
miss->depend.name);
|
||||||
|
@ -535,6 +536,12 @@ int sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PMList **
|
||||||
if(doremove) {
|
if(doremove) {
|
||||||
pmsyncpkg_t *rsync = find_pkginsync(miss->depend.name, trans->packages);
|
pmsyncpkg_t *rsync = find_pkginsync(miss->depend.name, trans->packages);
|
||||||
pmpkg_t *q = pkg_new(miss->depend.name, NULL);
|
pmpkg_t *q = pkg_new(miss->depend.name, NULL);
|
||||||
|
if(q == NULL) {
|
||||||
|
if(data) {
|
||||||
|
FREELIST(*data);
|
||||||
|
}
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
q->requiredby = _alpm_list_strdup(local->requiredby);
|
q->requiredby = _alpm_list_strdup(local->requiredby);
|
||||||
if(sync->type != PM_SYNC_TYPE_REPLACE) {
|
if(sync->type != PM_SYNC_TYPE_REPLACE) {
|
||||||
/* switch this sync type to REPLACE */
|
/* switch this sync type to REPLACE */
|
||||||
|
|
Loading…
Add table
Reference in a new issue