- merged db_open and db_create into one single function

- moved the .lastupdate support to the frontend
This commit is contained in:
Aurelien Foret 2006-02-15 22:51:28 +00:00
parent 2e128d3a41
commit 6e76fd8af3
4 changed files with 20 additions and 115 deletions

View File

@ -187,17 +187,9 @@ pmdb_t *alpm_db_register(char *treename)
RET_ERR(PM_ERR_DB_NOT_NULL, NULL);
}
db = db_open(handle->root, handle->dbpath, treename);
db = db_open(handle->root, handle->dbpath, treename, DB_O_CREATE);
if(db == NULL) {
/* couldn't open the db directory - try creating it */
if(db_create(handle->root, handle->dbpath, treename) == -1) {
RET_ERR(PM_ERR_DB_CREATE, NULL);
}
db = db_open(handle->root, handle->dbpath, treename);
if(db == NULL) {
/* couldn't open the db directory */
RET_ERR(PM_ERR_DB_OPEN, NULL);
}
RET_ERR(PM_ERR_DB_OPEN, NULL);
}
if(strcmp(treename, "local") == 0) {
@ -270,7 +262,6 @@ void *alpm_db_getinfo(PM_DB *db, unsigned char parm)
switch(parm) {
case PM_DB_TREENAME: data = db->treename; break;
case PM_DB_LASTUPDATE: data = db->lastupdate; break;
default:
data = NULL;
}
@ -284,7 +275,7 @@ void *alpm_db_getinfo(PM_DB *db, unsigned char parm)
* @param ts timestamp of the last modification time of the tarball
* @return 0 on success, -1 on error (pm_errno is set accordingly)
*/
int alpm_db_update(PM_DB *db, char *archive, char *ts)
int alpm_db_update(PM_DB *db, char *archive)
{
PMList *lp;
@ -298,12 +289,6 @@ int alpm_db_update(PM_DB *db, char *archive, char *ts)
RET_ERR(PM_ERR_DB_NOT_FOUND, -1);
}
if(ts && strlen(ts) != 0) {
if(strcmp(ts, db->lastupdate) == 0) {
RET_ERR(PM_ERR_DB_UPTODATE, -1);
}
}
/* remove the old dir */
_alpm_log(PM_LOG_FLOW2, "flushing database %s/%s", handle->dbpath, db->treename);
for(lp = db_get_pkgcache(db); lp; lp = lp->next) {
@ -328,12 +313,6 @@ int alpm_db_update(PM_DB *db, char *archive, char *ts)
RET_ERR(PM_ERR_SYSTEM, -1);
}
if(ts && strlen(ts) != 0) {
if(db_setlastupdate(db, ts) == -1) {
RET_ERR(PM_ERR_SYSTEM, -1);
}
}
return(0);
}

View File

@ -105,8 +105,7 @@ int alpm_get_option(unsigned char parm, long *data);
/* Info parameters */
enum {
PM_DB_TREENAME = 1,
PM_DB_LASTUPDATE
PM_DB_TREENAME = 1
};
PM_DB *alpm_db_register(char *treename);
@ -114,7 +113,7 @@ int alpm_db_unregister(PM_DB *db);
void *alpm_db_getinfo(PM_DB *db, unsigned char parm);
int alpm_db_update(PM_DB *db, char *archive, char *ts);
int alpm_db_update(PM_DB *db, char *archive);
PM_PKG *alpm_db_readpkg(PM_DB *db, char *name);
PM_LIST *alpm_db_getpkgcache(PM_DB *db);

View File

@ -38,7 +38,7 @@
#include "alpm.h"
/* Open a database and return a pmdb_t handle */
pmdb_t *db_open(char *root, char *dbpath, char *treename)
pmdb_t *db_open(char *root, char *dbpath, char *treename, int mode)
{
pmdb_t *db;
@ -55,9 +55,17 @@ pmdb_t *db_open(char *root, char *dbpath, char *treename)
db->dir = opendir(db->path);
if(db->dir == NULL) {
FREE(db->path);
FREE(db);
return(NULL);
if(mode & DB_O_CREATE) {
_alpm_log(PM_LOG_WARNING, "could not open database '%s' -- try creating it", treename);
if(_alpm_makepath(db->path) == 0) {
db->dir = opendir(db->path);
}
}
if(!(mode & DB_O_CREATE) || db->dir == NULL) {
FREE(db->path);
FREE(db);
return(NULL);
}
}
STRNCPY(db->treename, treename, DB_TREENAME_LEN);
@ -65,8 +73,6 @@ pmdb_t *db_open(char *root, char *dbpath, char *treename)
db->pkgcache = NULL;
db->grpcache = NULL;
db_getlastupdate(db, db->lastupdate);
return(db);
}
@ -92,81 +98,6 @@ void db_close(pmdb_t *db)
return;
}
int db_create(char *root, char *dbpath, char *treename)
{
char path[PATH_MAX];
if(root == NULL || dbpath == NULL || treename == NULL) {
return(-1);
}
snprintf(path, PATH_MAX, "%s%s/%s", root, dbpath, treename);
if(_alpm_makepath(path) != 0) {
return(-1);
}
return(0);
}
/* reads dbpath/.lastupdate and populates *ts with the contents.
* *ts should be malloc'ed and should be at least 15 bytes.
*
* Returns 0 on success, 1 on error
*
*/
int db_getlastupdate(pmdb_t *db, char *ts)
{
FILE *fp;
char path[PATH_MAX];
if(db == NULL || ts == NULL) {
return(-1);
}
/* get the last update time, if it's there */
snprintf(path, PATH_MAX, "%s/.lastupdate", db->path);
if((fp = fopen(path, "r")) == NULL) {
return(-1);
} else {
char line[256];
if(fgets(line, sizeof(line), fp)) {
STRNCPY(ts, line, 15); /* YYYYMMDDHHMMSS */
ts[14] = '\0';
} else {
fclose(fp);
return(-1);
}
}
fclose(fp);
return(0);
}
/* writes the dbpath/.lastupdate with the contents of *ts
*/
int db_setlastupdate(pmdb_t *db, char *ts)
{
FILE *fp;
char file[PATH_MAX];
if(db == NULL || ts == NULL || strlen(ts) == 0) {
return(-1);
}
snprintf(file, PATH_MAX, "%s/.lastupdate", db->path);
if((fp = fopen(file, "w")) == NULL) {
return(-1);
}
if(fputs(ts, fp) <= 0) {
fclose(fp);
return(-1);
}
fclose(fp);
STRNCPY(db->lastupdate, ts, DB_UPDATE_LEN);
return(0);
}
void db_rewind(pmdb_t *db)
{
if(db == NULL || db->dir == NULL) {

View File

@ -35,7 +35,8 @@
#define INFRQ_ALL 0xFF
#define DB_TREENAME_LEN 128
#define DB_UPDATE_LEN 16
#define DB_O_CREATE 0x01
/* Database */
typedef struct __pmdb_t {
@ -44,15 +45,10 @@ typedef struct __pmdb_t {
DIR *dir;
PMList *pkgcache;
PMList *grpcache;
char lastupdate[DB_UPDATE_LEN];
} pmdb_t;
pmdb_t *db_open(char *root, char *dbpath, char *treename);
pmdb_t *db_open(char *root, char *dbpath, char *treename, int mode);
void db_close(pmdb_t *db);
int db_create(char *root, char *dbpath, char *treename);
int db_getlastupdate(pmdb_t *db, char *ts);
int db_setlastupdate(pmdb_t *db, char *ts);
void db_rewind(pmdb_t *db);
pmpkg_t *db_scan(pmdb_t *db, char *target, unsigned int inforeq);