]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
- 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 ac3ba516f8917e7a99399485aaca597f1b992615..361041d27d70fc797ac0b345512d60e726b29d0d 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 0e4ec94309f95b268b188f49683e01f0ac5eb340..197e53cb12f57f75f4f5b1968c625c235519f97e 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 6cbfedbf06cbbc53737d0a635d25f100856f2a1d..dfd7a5121d5b6b0e84106337c537cb40a5f31d41 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;
     }
 }
 
@@ -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)
 {
index 3f6abbb7424cd69fe55bc896fc052c9edb1d91a5..10a28466da0eb5fa0cf085271490dde8b9a0d4a5 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