- move search position into pool
authorMichael Schroeder <mls@suse.de>
Thu, 9 Oct 2008 14:15:51 +0000 (14:15 +0000)
committerMichael Schroeder <mls@suse.de>
Thu, 9 Oct 2008 14:15:51 +0000 (14:15 +0000)
- add dataiterator_setpos()

src/pool.h
src/repo.h
src/repodata.c
src/repodata.h

index ac3ba51..361041d 100644 (file)
@@ -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)
index 0e4ec94..197e53c 100644 (file)
@@ -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);
index 6cbfedb..dfd7a51 100644 (file)
@@ -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;
     }
 }
 
@@ -1193,6 +1203,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)
 {
   if (di->state == di_nextsolvableattr)
index 3f6abbb..10a2846 100644 (file)
@@ -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