From 9dc06649bccf348c5bbc4c12c9701dff9872a672 Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Mon, 21 Feb 2011 17:43:52 +0100 Subject: [PATCH] - add repodata_lookup_type() and repodata_delete(). Support REPOKEY_TYPE_DELETED a bit more --- ext/repo_susetags.c | 12 ++++++---- ext/repo_write.c | 5 +++++ src/repodata.c | 54 +++++++++++++++++++++++++++++++++++++-------- src/repodata.h | 2 ++ src/repopack.h | 2 ++ 5 files changed, 62 insertions(+), 13 deletions(-) diff --git a/ext/repo_susetags.c b/ext/repo_susetags.c index c75ad3ee..1e2885c6 100644 --- a/ext/repo_susetags.c +++ b/ext/repo_susetags.c @@ -445,11 +445,15 @@ static Id lookup_shared_id(Repodata *data, Id p, Id keyname, Id voidid, int uninternalized) { Id r; - if (repodata_lookup_void(data, p, keyname)) - return voidid; - r = repodata_lookup_id(data, p, keyname); + r = repodata_lookup_type(data, p, keyname); if (r) - return r; + { + if (r == REPOKEY_TYPE_VOID) + return voidid; + r = repodata_lookup_id(data, p, keyname); + if (r) + return r; + } if (uninternalized && data->attrs) { Id *ap = data->attrs[p - data->start]; diff --git a/ext/repo_write.c b/ext/repo_write.c index 303c0fd2..1ae20ed8 100644 --- a/ext/repo_write.c +++ b/ext/repo_write.c @@ -1142,6 +1142,11 @@ repo_write(Repo *repo, FILE *fp, int (*keyfilter)(Repo *repo, Repokey *key, void cbdata.keymap[n] = cbdata.keymap[key->name]; continue; } + if (key->type == REPOKEY_TYPE_DELETED) + { + cbdata.keymap[n] = 0; + continue; + } /* see if we already had this one, should use hash for fast miss */ for (k = 0; k < cbdata.nmykeys; k++) { diff --git a/src/repodata.c b/src/repodata.c index 39cea014..9fc0c8e5 100644 --- a/src/repodata.c +++ b/src/repodata.c @@ -542,6 +542,8 @@ find_key_data(Repodata *data, Id solvid, Id keyname, Repokey **keypp) if (!*kp) return 0; *keypp = key = data->keys + *kp; + if (key->type == REPOKEY_TYPE_DELETED) + return 0; if (key->type == REPOKEY_TYPE_VOID || key->type == REPOKEY_TYPE_CONSTANT || key->type == REPOKEY_TYPE_CONSTANTID) return dp; /* no need to forward... */ dp = forward_to_key(data, *kp, keyp, dp); @@ -550,6 +552,20 @@ find_key_data(Repodata *data, Id solvid, Id keyname, Repokey **keypp) return get_data(data, key, &dp, 0); } +Id +repodata_lookup_type(Repodata *data, Id solvid, Id keyname) +{ + Id schema, *keyp, *kp; + if (!maybe_load_repodata(data, keyname)) + return 0; + if (!solvid2data(data, solvid, &schema)) + return 0; + keyp = data->schemadata + data->schemata[schema]; + for (kp = keyp; *kp; kp++) + if (data->keys[*kp].name == keyname) + return data->keys[*kp].type == REPOKEY_TYPE_DELETED ? 0 : data->keys[*kp].type; + return 0; +} Id repodata_lookup_id(Repodata *data, Id solvid, Id keyname) @@ -569,14 +585,6 @@ repodata_lookup_id(Repodata *data, Id solvid, Id keyname) return id; } -Id -repodata_globalize_id(Repodata *data, Id id, int create) -{ - if (!id || !data || !data->localpool) - return id; - return str2id(data->repo->pool, stringpool_id2str(&data->spool, id), create); -} - const char * repodata_lookup_str(Repodata *data, Id solvid, Id keyname) { @@ -676,6 +684,15 @@ repodata_lookup_idarray(Repodata *data, Id solvid, Id keyname, Queue *q) return 1; } +Id +repodata_globalize_id(Repodata *data, Id id, int create) +{ + if (!id || !data || !data->localpool) + return id; + return str2id(data->repo->pool, stringpool_id2str(&data->spool, id), create); +} + + /************************************************************************ * data search */ @@ -787,6 +804,8 @@ repodata_search(Repodata *data, Id solvid, Id keyname, int flags, int (*callback key = data->keys + keyid; ddp = get_data(data, key, &dp, *keyp ? 1 : 0); + if (key->type == REPOKEY_TYPE_DELETED) + continue; if (key->type == REPOKEY_TYPE_FLEXARRAY || key->type == REPOKEY_TYPE_FIXARRAY) { struct subschema_data subd; @@ -1301,6 +1320,8 @@ dataiterator_step(Dataiterator *di) di->ddp = get_data(di->data, di->key, &di->dp, di->keyp[1] && (!di->keyname || (di->flags & SEARCH_SUB) != 0) ? 1 : 0); if (!di->ddp) goto di_nextkey; + if (di->key->type == REPOKEY_TYPE_DELETED) + goto di_nextkey; if (di->key->type == REPOKEY_TYPE_FIXARRAY || di->key->type == REPOKEY_TYPE_FLEXARRAY) goto di_enterarray; if (di->nkeynames && di->nparents - di->rootlevel < di->nkeynames) @@ -2303,7 +2324,19 @@ repodata_delete_uninternalized(Repodata *data, Id solvid, Id keyname) *pp = 0; } -/* add all attrs from src to dest */ +/* XXX: does not work correctly, needs fix in iterators! */ +void +repodata_delete(Repodata *data, Id solvid, Id keyname) +{ + Repokey key; + key.name = keyname; + key.type = REPOKEY_TYPE_DELETED; + key.size = 0; + key.storage = KEY_STORAGE_INCORE; + repodata_set(data, solvid, &key, 0); +} + +/* add all (uninternalized) attrs from src to dest */ void repodata_merge_attrs(Repodata *data, Id dest, Id src) { @@ -2314,6 +2347,7 @@ repodata_merge_attrs(Repodata *data, Id dest, Id src) repodata_insert_keyid(data, dest, keyp[0], keyp[1], 0); } +/* add some (uninternalized) attrs from src to dest */ void repodata_merge_some_attrs(Repodata *data, Id dest, Id src, Map *keyidmap, int overwrite) { @@ -2861,6 +2895,8 @@ repodata_create_stubs(Repodata *data) repodata_key2id(sdata, &xkey, 1); xkeyname = 0; } + default: + break; } } dataiterator_free(&di); diff --git a/src/repodata.h b/src/repodata.h index feac731b..1b7ebe0a 100644 --- a/src/repodata.h +++ b/src/repodata.h @@ -180,6 +180,7 @@ int repodata_filelistfilter_matches(Repodata *data, const char *str); /* lookup functions */ +Id repodata_lookup_type(Repodata *data, Id solvid, Id keyname); Id repodata_lookup_id(Repodata *data, Id solvid, Id keyname); const char *repodata_lookup_str(Repodata *data, Id solvid, Id keyname); int repodata_lookup_num(Repodata *data, Id solvid, Id keyname, unsigned int *value); @@ -240,6 +241,7 @@ void repodata_add_poolstr_array(Repodata *data, Id solvid, Id keyname, const cha void repodata_add_fixarray(Repodata *data, Id solvid, Id keyname, Id ghandle); void repodata_add_flexarray(Repodata *data, Id solvid, Id keyname, Id ghandle); +void repodata_delete(Repodata *data, Id solvid, Id keyname); void repodata_delete_uninternalized(Repodata *data, Id solvid, Id keyname); /* diff --git a/src/repopack.h b/src/repopack.h index e55072c7..c97b9204 100644 --- a/src/repopack.h +++ b/src/repopack.h @@ -126,6 +126,7 @@ data_skip(unsigned char *dp, int type) case REPOKEY_TYPE_VOID: case REPOKEY_TYPE_CONSTANT: case REPOKEY_TYPE_CONSTANTID: + case REPOKEY_TYPE_DELETED: return dp; case REPOKEY_TYPE_ID: case REPOKEY_TYPE_NUM: @@ -199,6 +200,7 @@ data_skip_verify(unsigned char *dp, int type, int maxid, int maxdir) case REPOKEY_TYPE_VOID: case REPOKEY_TYPE_CONSTANT: case REPOKEY_TYPE_CONSTANTID: + case REPOKEY_TYPE_DELETED: return dp; case REPOKEY_TYPE_NUM: while ((*dp & 0x80) != 0) -- 2.47.3