]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Improve handing over of the parant kv in subarray searches
authorMichael Schroeder <mls@suse.de>
Mon, 24 Sep 2018 11:04:50 +0000 (13:04 +0200)
committerMichael Schroeder <mls@suse.de>
Mon, 24 Sep 2018 11:04:50 +0000 (13:04 +0200)
We now pass it disguised as keyskip.

src/dataiterator.h
src/repodata.c
src/repodata.h

index 95877f3a4b2c7d3e88691ecc0e391b483a474399..148c97354d5d017a6b536c53ade2175e9aeb6f87 100644 (file)
@@ -62,7 +62,8 @@ typedef struct _KeyValue {
 #define SEARCH_FILES                   (1<<17)
 #define SEARCH_CHECKSUMS               (1<<18)
 
-/* dataiterator internal */
+/* internal */
+#define SEARCH_SUBSCHEMA               (1<<30)
 #define SEARCH_THISSOLVID              (1<<31)
 
 /* obsolete */
index 62ec461038b8656cb25a9130623988d3215bcc37..aa1a84001231a91ed80c39a51efe6ca5fc88362b 100644 (file)
@@ -967,6 +967,9 @@ data_fetch_uninternalized(Repodata *data, Repokey *key, Id value, KeyValue *kv)
       kv->num = 0;     /* not stringified */
       kv->str = (const char *)data->attrdata + value;
       return;
+    case REPOKEY_TYPE_BINARY:
+      kv->str = (const char *)data_read_id(data->attrdata + value, (Id *)&kv->num);
+      return;
     case REPOKEY_TYPE_IDARRAY:
       array = data->attriddata + (value + kv->entry);
       kv->id = array[0];
@@ -1111,17 +1114,12 @@ struct subschema_data {
 void
 repodata_search_arrayelement(Repodata *data, Id solvid, Id keyname, int flags, KeyValue *kv, int (*callback)(void *cbdata, Solvable *s, Repodata *data, Repokey *key, KeyValue *kv), void *cbdata)
 {
-  struct subschema_data subd;
-  subd.solvid = solvid;
-  subd.cbdata = cbdata;
-  subd.parent = kv;
-  repodata_search_keyskip(data, SOLVID_SUBSCHEMA, keyname, flags, 0, callback, &subd);
+  repodata_search_keyskip(data, solvid, keyname, flags | SEARCH_SUBSCHEMA, (Id *)kv, callback, cbdata);
 }
 
 static int
 repodata_search_array(Repodata *data, Id solvid, Id keyname, int flags, Repokey *key, KeyValue *kv, int (*callback)(void *cbdata, Solvable *s, Repodata *data, Repokey *key, KeyValue *kv), void *cbdata)
 {
-  struct subschema_data subd;
   Solvable *s = solvid > 0 ? data->repo->pool->solvables + solvid : 0;
   unsigned char *dp = (unsigned char *)kv->str;
   int stop;
@@ -1129,9 +1127,6 @@ repodata_search_array(Repodata *data, Id solvid, Id keyname, int flags, Repokey
 
   if (!dp || kv->entry != -1)
     return 0;
-  subd.solvid = solvid;
-  subd.cbdata = cbdata;
-  subd.parent = kv;
   while (++kv->entry < kv->num)
     {
       if (kv->entry)
@@ -1145,7 +1140,7 @@ repodata_search_array(Repodata *data, Id solvid, Id keyname, int flags, Repokey
       if (stop && stop != SEARCH_ENTERSUB)
        return stop;
       if ((flags & SEARCH_SUB) != 0 || stop == SEARCH_ENTERSUB)
-       repodata_search_keyskip(data, SOLVID_SUBSCHEMA, keyname, flags, 0, callback, &subd);
+        repodata_search_keyskip(data, solvid, keyname, flags | SEARCH_SUBSCHEMA, (Id *)kv, callback, cbdata);
     }
   if ((flags & SEARCH_ARRAYSENTINEL) != 0)
     {
@@ -1174,14 +1169,13 @@ repodata_search_keyskip(Repodata *data, Id solvid, Id keyname, int flags, Id *ke
 
   if (!maybe_load_repodata(data, keyname))
     return;
-  if (solvid == SOLVID_SUBSCHEMA)
-    {
-      struct subschema_data *subd = cbdata;
-      cbdata = subd->cbdata;
-      solvid = subd->solvid;
-      schema = subd->parent->id;
-      dp = (unsigned char *)subd->parent->str;
-      kv.parent = subd->parent;
+  if ((flags & SEARCH_SUBSCHEMA) != 0)
+    {
+      flags ^= SEARCH_SUBSCHEMA;
+      kv.parent = (KeyValue *)keyskip;
+      keyskip = 0;
+      schema = kv.parent->id;
+      dp = (unsigned char *)kv.parent->str;
     }
   else
     {
index 05d34a809627759c337ac92f9b86d0fd3267d972..81248852d8ebde35f2a36b33ed3ddf8cb184e073 100644 (file)
@@ -143,7 +143,6 @@ typedef struct _Repodata {
 
 #define SOLVID_META            -1
 #define SOLVID_POS             -2
-#define SOLVID_SUBSCHEMA       -3              /* internal! */
 
 
 /*-----