From: Michael Schroeder Date: Wed, 19 Sep 2018 11:18:42 +0000 (+0200) Subject: Implement the REPOWRITER_KEEP_TYPE_DELETED flag X-Git-Tag: 0.7.0~38 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e00c3cf565274d130d53dc7abd6be49194afdc44;p=thirdparty%2Flibsolv.git Implement the REPOWRITER_KEEP_TYPE_DELETED flag --- diff --git a/src/dataiterator.h b/src/dataiterator.h index a6f2b028..95877f3a 100644 --- a/src/dataiterator.h +++ b/src/dataiterator.h @@ -52,7 +52,7 @@ typedef struct _KeyValue { #define SEARCH_SUB (1<<9) #define SEARCH_ARRAYSENTINEL (1<<10) #define SEARCH_DISABLED_REPOS (1<<11) -#define SEARCH_COMPLETE_FILELIST (1<<12) /* ignored, this is the default */ +#define SEARCH_KEEP_TYPE_DELETED (1<<12) /* only has effect if no keyname is given */ /* stringification flags */ #define SEARCH_SKIP_KIND (1<<16) @@ -65,6 +65,9 @@ typedef struct _KeyValue { /* dataiterator internal */ #define SEARCH_THISSOLVID (1<<31) +/* obsolete */ +#define SEARCH_COMPLETE_FILELIST 0 /* ignored, this is the default */ + /* * Datamatcher: match a string against a query */ diff --git a/src/repo.c b/src/repo.c index 30acb43b..f0c11ab1 100644 --- a/src/repo.c +++ b/src/repo.c @@ -1048,7 +1048,6 @@ repo_create_keyskip(Repo *repo, Id entry, Id **oldkeyskip) last = data; cnt++; } -printf("repo_create_keyskip: cnt %d\n", cnt); if (cnt <= 1) { if (oldkeyskip) diff --git a/src/repo_write.c b/src/repo_write.c index 6b1dc06f..9de1646b 100644 --- a/src/repo_write.c +++ b/src/repo_write.c @@ -1176,6 +1176,7 @@ repowriter_write(Repowriter *writer, FILE *fp) unsigned int solv_flags; Id *oldkeyskip = 0; Id *keyskip = 0; + int searchflags = 0; Id id, *sp; @@ -1496,6 +1497,10 @@ for (i = 1; i < target.nkeys; i++) /********************************************************************/ + searchflags = SEARCH_SUB|SEARCH_ARRAYSENTINEL; + if ((writer->flags & REPOWRITER_KEEP_TYPE_DELETED) != 0) + searchflags |= SEARCH_KEEP_TYPE_DELETED; + /* set needed count of all strings and rels, * find which keys are used in the solvables * put all strings in own spool @@ -1523,7 +1528,7 @@ for (i = 1; i < target.nkeys; i++) continue; cbdata.keymap = keymap + keymapstart[j]; cbdata.lastdirid = 0; /* clear dir mapping cache */ - repodata_search_keyskip(data, SOLVID_META, 0, SEARCH_SUB|SEARCH_ARRAYSENTINEL, keyskip, collect_needed_cb, &cbdata); + repodata_search_keyskip(data, SOLVID_META, 0, searchflags, keyskip, collect_needed_cb, &cbdata); } needid = cbdata.needid; /* maybe relocated */ sp = cbdata.sp; @@ -1560,7 +1565,7 @@ for (i = 1; i < target.nkeys; i++) continue; cbdata.keymap = keymap + keymapstart[j]; cbdata.lastdirid = 0; - repodata_search_keyskip(data, i, 0, SEARCH_SUB|SEARCH_ARRAYSENTINEL, keyskip, collect_needed_cb, &cbdata); + repodata_search_keyskip(data, i, 0, searchflags, keyskip, collect_needed_cb, &cbdata); } needid = cbdata.needid; /* maybe relocated */ } @@ -1795,7 +1800,7 @@ fprintf(stderr, "dir %d used %d\n", i, cbdata.dirused ? cbdata.dirused[i] : 1); continue; cbdata.keymap = keymap + keymapstart[j]; cbdata.lastdirid = 0; - repodata_search_keyskip(data, SOLVID_META, 0, SEARCH_SUB|SEARCH_ARRAYSENTINEL, keyskip, collect_data_cb, &cbdata); + repodata_search_keyskip(data, SOLVID_META, 0, searchflags, keyskip, collect_data_cb, &cbdata); } if (xd->len - cbdata.lastlen > cbdata.maxdata) @@ -1835,7 +1840,7 @@ fprintf(stderr, "dir %d used %d\n", i, cbdata.dirused ? cbdata.dirused[i] : 1); continue; cbdata.keymap = keymap + keymapstart[j]; cbdata.lastdirid = 0; - repodata_search_keyskip(data, i, 0, SEARCH_SUB|SEARCH_ARRAYSENTINEL, keyskip, collect_data_cb, &cbdata); + repodata_search_keyskip(data, i, 0, searchflags, keyskip, collect_data_cb, &cbdata); } } if (xd->len - cbdata.lastlen > cbdata.maxdata) @@ -2009,7 +2014,7 @@ fprintf(stderr, "dir %d used %d\n", i, cbdata.dirused ? cbdata.dirused[i] : 1); continue; cbdata.keymap = keymap + keymapstart[j]; cbdata.lastdirid = 0; - repodata_search_keyskip(data, i, 0, SEARCH_SUB|SEARCH_ARRAYSENTINEL, keyskip, collect_data_cb, &cbdata); + repodata_search_keyskip(data, i, 0, searchflags, keyskip, collect_data_cb, &cbdata); } if (xd->len > 1024 * 1024) { diff --git a/src/repodata.c b/src/repodata.c index 9c65776d..52d68ba2 100644 --- a/src/repodata.c +++ b/src/repodata.c @@ -1188,7 +1188,7 @@ repodata_search_keyskip(Repodata *data, Id solvid, Id keyname, int flags, Id *ke return; continue; } - if (key->type == REPOKEY_TYPE_DELETED) + if (key->type == REPOKEY_TYPE_DELETED && !(flags & SEARCH_KEEP_TYPE_DELETED)) { if (onekey) return; @@ -1712,7 +1712,7 @@ dataiterator_step(Dataiterator *di) goto di_nextkey; if (di->keyskip && (di->key->name >= di->keyskip[0] || di->keyskip[3 + di->key->name] != di->keyskip[1] + di->data->repodataid)) goto di_nextkey; - if (di->key->type == REPOKEY_TYPE_DELETED) + if (di->key->type == REPOKEY_TYPE_DELETED && !(di->flags & SEARCH_KEEP_TYPE_DELETED)) goto di_nextkey; if (di->key->type == REPOKEY_TYPE_FIXARRAY || di->key->type == REPOKEY_TYPE_FLEXARRAY) goto di_enterarray; @@ -2954,7 +2954,6 @@ repodata_unset_uninternalized(Repodata *data, Id solvid, Id keyname) *pp = 0; } -/* XXX: does not work correctly, needs fix in iterators! */ void repodata_unset(Repodata *data, Id solvid, Id keyname) {