From: Michael Schroeder Date: Mon, 13 Oct 2008 14:09:54 +0000 (+0000) Subject: - add dataiterator_setpos_parent X-Git-Tag: BASE-SuSE-Code-12_1-Branch~308^2~149 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=018809cb5f8df2ec4371b60042982bc4466c90e3;p=thirdparty%2Flibsolv.git - add dataiterator_setpos_parent - check kv.eof in dataiterator_setpos --- diff --git a/src/repo.h b/src/repo.h index a0e20b34..4f801c17 100644 --- a/src/repo.h +++ b/src/repo.h @@ -283,6 +283,7 @@ void dataiterator_init(Dataiterator *di, Repo *repo, Id p, Id keyname, void dataiterator_free(Dataiterator *di); int dataiterator_step(Dataiterator *di); void dataiterator_setpos(Dataiterator *di); +void dataiterator_setpos_parent(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 6201928b..5e1c29df 100644 --- a/src/repodata.c +++ b/src/repodata.c @@ -964,6 +964,11 @@ dataiterator_init(Dataiterator *di, Repo *repo, Id p, Id keyname, const char *ma if (p == SOLVID_POS) { di->repo = di->pool->pos.repo; + if (!di->repo) + { + di->state = di_bye; + return; + } di->data = di->repo->repodata + di->pool->pos.repodataid; di->repoid = -1; di->repodataid = -1; @@ -1209,12 +1214,31 @@ dataiterator_step(Dataiterator *di) void dataiterator_setpos(Dataiterator *di) { + if (di->kv.eof) + { + memset(&di->pool->pos, 0, sizeof(di->pool->pos)); + return; + } 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_setpos_parent(Dataiterator *di) +{ + if (!di->kv.parent) + { + memset(&di->pool->pos, 0, sizeof(di->pool->pos)); + return; + } + di->pool->pos.repo = di->repo; + di->pool->pos.repodataid = di->data - di->repo->repodata; + di->pool->pos.schema = di->kv.parent->id; + di->pool->pos.dp = (unsigned char *)di->kv.parent->str - di->data->incoredata; +} + void dataiterator_skip_attribute(Dataiterator *di) {