- add dataiterator_setpos_parent
authorMichael Schroeder <mls@suse.de>
Mon, 13 Oct 2008 14:09:54 +0000 (14:09 +0000)
committerMichael Schroeder <mls@suse.de>
Mon, 13 Oct 2008 14:09:54 +0000 (14:09 +0000)
- check kv.eof in dataiterator_setpos

src/repo.h
src/repodata.c

index a0e20b3..4f801c1 100644 (file)
@@ -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);
index 6201928..5e1c29d 100644 (file)
@@ -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,6 +1214,11 @@ 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;
@@ -1216,6 +1226,20 @@ dataiterator_setpos(Dataiterator *di)
 }
 
 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)
 {
   if (di->state == di_nextsolvableattr)