From: Michael Schroeder Date: Thu, 9 Oct 2008 14:15:51 +0000 (+0000) Subject: - move search position into pool X-Git-Tag: BASE-SuSE-Code-12_1-Branch~308^2~161 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=4e941384b7eb38d9d19f6a58f2644807869ccdaa;p=thirdparty%2Flibsolv.git - move search position into pool - add dataiterator_setpos() --- diff --git a/src/pool.h b/src/pool.h index ac3ba516..361041d2 100644 --- a/src/pool.h +++ b/src/pool.h @@ -43,6 +43,13 @@ struct _Repodata; struct _Repokey; struct _KeyValue; +typedef struct _Repopos { + struct _Repo *repo; + Id repodataid; + Id schema; + Id dp; +} Repopos; + struct _Pool { struct _Stringpool ss; @@ -99,6 +106,9 @@ struct _Pool { /* load callback */ FILE * (*loadcallback)(struct _Pool *, struct _Repodata *, void *); void *loadcallbackdata; + + /* search position */ + Repopos pos; }; #define SAT_FATAL (1<<0) diff --git a/src/repo.h b/src/repo.h index 0e4ec943..197e53cb 100644 --- a/src/repo.h +++ b/src/repo.h @@ -279,6 +279,7 @@ void dataiterator_init(Dataiterator *di, Repo *repo, Id p, Id keyname, const char *match, int flags); void dataiterator_free(Dataiterator *di); int dataiterator_step(Dataiterator *di); +void dataiterator_setpos(Dataiterator *di); int dataiterator_match(Dataiterator *di, int flags, const void *match); void dataiterator_skip_attribute(Dataiterator *di); void dataiterator_skip_solvable(Dataiterator *di); diff --git a/src/repodata.c b/src/repodata.c index 6cbfedbf..dfd7a512 100644 --- a/src/repodata.c +++ b/src/repodata.c @@ -457,8 +457,13 @@ entry2data(Repodata *data, Id entry, Id *schemap) dp += 1; else if (entry == REPOENTRY_POS) /* META */ { - *schemap = data->pos.schema; - return data->incoredata + data->pos.dp; + Pool *pool = data->repo->pool; + if (data->repo != pool->pos.repo) + return 0; + if (data != data->repo->repodata + pool->pos.repodataid) + return 0; + *schemap = pool->pos.schema; + return data->incoredata + pool->pos.dp; } else { @@ -728,17 +733,22 @@ repodata_search(Repodata *data, Id entry, Id keyname, int (*callback)(void *cbda } void -repodata_set_pos_kv(Repodata *data, KeyValue *kv) +repodata_setpos_kv(Repodata *data, KeyValue *kv) { + Pool *pool = data->repo->pool; if (!kv) { - data->pos.dp = 0; - data->pos.schema = 0; + pool->pos.repo = 0; + pool->pos.repodataid = 0; + pool->pos.dp = 0; + pool->pos.schema = 0; } else { - data->pos.dp = (unsigned char *)kv->str - data->incoredata; - data->pos.schema = kv->id; + pool->pos.repo = 0; + pool->pos.repodataid = data - data->repo->repodata; + pool->pos.dp = (unsigned char *)kv->str - data->incoredata; + pool->pos.schema = kv->id; } } @@ -1192,6 +1202,15 @@ dataiterator_step(Dataiterator *di) } } +void +dataiterator_setpos(Dataiterator *di) +{ + di->pool->pos.repo = di->repo; + di->pool->pos.repodataid = di->data - di->repo->repodata; + di->pool->pos.schema = di->kv.id; + di->pool->pos.dp = (unsigned char *)di->kv.str - di->data->incoredata; +} + void dataiterator_skip_attribute(Dataiterator *di) { diff --git a/src/repodata.h b/src/repodata.h index 3f6abbb7..10a28466 100644 --- a/src/repodata.h +++ b/src/repodata.h @@ -40,11 +40,6 @@ typedef struct _Attrblobpage long file_size; } Attrblobpage; -typedef struct _Repopos { - Id schema; - Id dp; -} Repopos; - typedef struct _Repodata { struct _Repo *repo; /* back pointer to repo */ @@ -118,8 +113,6 @@ typedef struct _Repodata { Id lastkey; Id lastdatalen; - Repopos pos; - } Repodata; #define REPOENTRY_META -1