static void doquery(Pool *pool, Repo *repo, const char *query) { Id id, type = 0; char qbuf[256]; const char *qp; Dataiterator di; qp = strchr(query, ':'); if (qp) { type = strn2id(pool, query, qp - query, 0); if (!type) exit(0); qp++; } else qp = query; snprintf(qbuf, sizeof(qbuf), "repository:repomd:%s", qp); id = str2id(pool, qbuf, 0); if (!id) exit(0); dataiterator_init(&di, pool, repo, SOLVID_META, id, 0, 0); dataiterator_prepend_keyname(&di, REPOSITORY_REPOMD); while (dataiterator_step(&di)) { if (type) { dataiterator_setpos_parent(&di); if (pool_lookup_id(pool, SOLVID_POS, REPOSITORY_REPOMD_TYPE) != type) continue; } switch (di.key->type) { case REPOKEY_TYPE_ID: case REPOKEY_TYPE_CONSTANTID: printf("%s\n", id2str(pool, di.kv.id)); break; case REPOKEY_TYPE_STR: printf("%s\n", di.kv.str); break; case REPOKEY_TYPE_NUM: printf("%d\n", di.kv.num); break; case REPOKEY_TYPE_SHA1: printf("sha1:%s\n", repodata_chk2str(di.data, di.key->type, (unsigned char *)di.kv.str)); break; case REPOKEY_TYPE_SHA256: printf("sha256:%s\n", repodata_chk2str(di.data, di.key->type, (unsigned char *)di.kv.str)); break; default: break; } } dataiterator_free(&di); }
static int dump_attr(Repo *repo, Repodata *data, Repokey *key, KeyValue *kv) { const char *keyname; KeyValue *kvp; int indent = 0; keyname = pool_id2str(repo->pool, key->name); for (kvp = kv; (kvp = kvp->parent) != 0; indent += 2) printf(" "); switch(key->type) { case REPOKEY_TYPE_ID: if (data && data->localpool) kv->str = stringpool_id2str(&data->spool, kv->id); else kv->str = pool_dep2str(repo->pool, kv->id); printf("%s: %s\n", keyname, kv->str); break; case REPOKEY_TYPE_CONSTANTID: printf("%s: %s\n", keyname, pool_dep2str(repo->pool, kv->id)); break; case REPOKEY_TYPE_IDARRAY: if (!kv->entry) printf("%s:\n%*s", keyname, indent, ""); if (data && data->localpool) printf(" %s\n", stringpool_id2str(&data->spool, kv->id)); else printf(" %s\n", pool_dep2str(repo->pool, kv->id)); break; case REPOKEY_TYPE_STR: printf("%s: %s\n", keyname, kv->str); break; case REPOKEY_TYPE_MD5: case REPOKEY_TYPE_SHA1: case REPOKEY_TYPE_SHA256: printf("%s: %s (%s)\n", keyname, repodata_chk2str(data, key->type, (unsigned char *)kv->str), pool_id2str(repo->pool, key->type)); break; case REPOKEY_TYPE_VOID: printf("%s: (void)\n", keyname); break; case REPOKEY_TYPE_U32: case REPOKEY_TYPE_CONSTANT: printf("%s: %u\n", keyname, kv->num); break; case REPOKEY_TYPE_NUM: printf("%s: %llu\n", keyname, SOLV_KV_NUM64(kv)); break; case REPOKEY_TYPE_BINARY: if (kv->num) printf("%s: %02x..%02x len %u\n", keyname, (unsigned char)kv->str[0], (unsigned char)kv->str[kv->num - 1], kv->num); else printf("%s: len 0\n", keyname); break; case REPOKEY_TYPE_DIRNUMNUMARRAY: if (!kv->entry) printf("%s:\n%*s", keyname, indent, ""); printf(" %s %u %u\n", repodata_dir2str(data, kv->id, 0), kv->num, kv->num2); break; case REPOKEY_TYPE_DIRSTRARRAY: if (!kv->entry) printf("%s:\n%*s", keyname, indent, ""); printf(" %s\n", repodata_dir2str(data, kv->id, kv->str)); break; case REPOKEY_TYPE_FIXARRAY: case REPOKEY_TYPE_FLEXARRAY: if (!kv->entry) printf("%s:\n", keyname); else printf("\n"); break; default: printf("%s: ?\n", keyname); break; } return 0; }
static int dump_attr_json(Repo *repo, Repodata *data, Repokey *key, KeyValue *kv, struct cbdata *cbdata) { Pool *pool = repo->pool; const char *keyname; KeyValue *kvp; int indent = cbdata->baseindent; int isarray = 0; const char *str; int depth = 0; keyname = pool_id2str(repo->pool, key->name); for (kvp = kv; (kvp = kvp->parent) != 0; indent += 4) depth++; if (cbdata->nfirst < depth + 1) { cbdata->first = solv_realloc(cbdata->first, depth + 16); memset(cbdata->first + cbdata->nfirst, 0, depth + 16 - cbdata->nfirst); cbdata->nfirst = depth + 16; } switch(key->type) { case REPOKEY_TYPE_IDARRAY: case REPOKEY_TYPE_DIRNUMNUMARRAY: case REPOKEY_TYPE_DIRSTRARRAY: isarray = 1; break; case REPOKEY_TYPE_FIXARRAY: case REPOKEY_TYPE_FLEXARRAY: isarray = 2; break; default: break; } if (!isarray || !kv->entry) { if (cbdata->first[depth]) printf(",\n"); printf("%*s%s: ", indent, "", jsonstring(pool, keyname)); cbdata->first[depth] = 1; } if (isarray == 1 && !kv->entry) printf("[\n%*s", indent + 2, ""); else if (isarray == 1 && kv->entry) printf("%*s", indent + 2, ""); switch(key->type) { case REPOKEY_TYPE_ID: if (data && data->localpool) str = stringpool_id2str(&data->spool, kv->id); else str = pool_dep2str(repo->pool, kv->id); printf("%s", jsonstring(pool, str)); break; case REPOKEY_TYPE_CONSTANTID: str = pool_dep2str(repo->pool, kv->id); printf("%s", jsonstring(pool, str)); break; case REPOKEY_TYPE_IDARRAY: if (data && data->localpool) str = stringpool_id2str(&data->spool, kv->id); else str = pool_dep2str(repo->pool, kv->id); printf("%s", jsonstring(pool, str)); break; case REPOKEY_TYPE_STR: str = kv->str; printf("%s", jsonstring(pool, str)); break; case REPOKEY_TYPE_MD5: case REPOKEY_TYPE_SHA1: case REPOKEY_TYPE_SHA256: printf("{\n"); printf("%*s \"value\": %s,\n", indent, "", jsonstring(pool, repodata_chk2str(data, key->type, (unsigned char *)kv->str))); printf("%*s \"type\": %s\n", indent, "", jsonstring(pool, pool_id2str(repo->pool, key->type))); printf("%*s}", indent, ""); break; case REPOKEY_TYPE_VOID: printf("null"); break; case REPOKEY_TYPE_U32: case REPOKEY_TYPE_CONSTANT: printf("%u", kv->num); break; case REPOKEY_TYPE_NUM: printf("%llu", SOLV_KV_NUM64(kv)); break; case REPOKEY_TYPE_BINARY: printf("\"<binary>\""); break; case REPOKEY_TYPE_DIRNUMNUMARRAY: printf("{\n"); printf("%*s \"dir\": %s,\n", indent, "", jsonstring(pool, repodata_dir2str(data, kv->id, 0))); printf("%*s \"num1\": %u,\n", indent, "", kv->num); printf("%*s \"num2\": %u\n", indent, "", kv->num2); printf("%*s }", indent, ""); break; case REPOKEY_TYPE_DIRSTRARRAY: printf("%s", jsonstring(pool, repodata_dir2str(data, kv->id, kv->str))); break; case REPOKEY_TYPE_FIXARRAY: case REPOKEY_TYPE_FLEXARRAY: cbdata->first[depth + 1] = 0; if (!kv->entry) printf("[\n"); else { if (kv->eof != 2) printf("\n%*s },\n", indent, ""); else printf("\n%*s }\n", indent, ""); } if (kv->eof != 2) printf("%*s {\n", indent, ""); else printf("%*s]", indent, ""); break; default: printf("\"?\""); break; } if (isarray == 1) { if (!kv->eof) printf(",\n"); else printf("\n%*s]", indent, ""); } return 0; }
void repo_add_rpmmd(Repo *repo, FILE *fp, const char *language, int flags) { Pool *pool = repo->pool; struct parsedata pd; char buf[BUFF_SIZE]; int i, l; struct stateswitch *sw; Repodata *data; unsigned int now; now = sat_timems(0); data = repo_add_repodata(repo, flags); memset(&pd, 0, sizeof(pd)); for (i = 0, sw = stateswitches; sw->from != NUMSTATES; i++, sw++) { if (!pd.swtab[sw->from]) pd.swtab[sw->from] = sw; pd.sbtab[sw->to] = sw->from; } pd.common.pool = pool; pd.common.repo = repo; pd.data = data; pd.content = sat_malloc(256); pd.acontent = 256; pd.lcontent = 0; pd.common.tmp = 0; pd.common.tmpl = 0; pd.kind = 0; pd.language = language; /* initialize the string pool where we will store the package checksums we know about, to get an Id we can use in a cache */ stringpool_init_empty(&pd.cspool); if ((flags & REPO_EXTEND_SOLVABLES) != 0) { /* setup join data */ Dataiterator di; dataiterator_init(&di, pool, repo, 0, SOLVABLE_CHECKSUM, 0, 0); while (dataiterator_step(&di)) { const char *str; int index; if (!sat_chksum_len(di.key->type)) continue; str = repodata_chk2str(di.data, di.key->type, (const unsigned char *)di.kv.str); index = stringpool_str2id(&pd.cspool, str, 1); if (index >= pd.ncscache) { pd.cscache = sat_zextend(pd.cscache, pd.ncscache, index + 1 - pd.ncscache, sizeof(Id), 255); pd.ncscache = index + 1; } pd.cscache[index] = di.solvid; } dataiterator_free(&di); } XML_Parser parser = XML_ParserCreate(NULL); XML_SetUserData(parser, &pd); pd.parser = &parser; XML_SetElementHandler(parser, startElement, endElement); XML_SetCharacterDataHandler(parser, characterData); for (;;) { l = fread(buf, 1, sizeof(buf), fp); if (XML_Parse(parser, buf, l, l == 0) == XML_STATUS_ERROR) { pool_debug(pool, SAT_FATAL, "repo_rpmmd: %s at line %u:%u\n", XML_ErrorString(XML_GetErrorCode(parser)), (unsigned int)XML_GetCurrentLineNumber(parser), (unsigned int)XML_GetCurrentColumnNumber(parser)); exit(1); } if (l == 0) break; } XML_ParserFree(parser); sat_free(pd.content); sat_free(pd.lastdirstr); join_freemem(); stringpool_free(&pd.cspool); sat_free(pd.cscache); if (!(flags & REPO_NO_INTERNALIZE)) repodata_internalize(data); POOL_DEBUG(SAT_DEBUG_STATS, "repo_add_rpmmd took %d ms\n", sat_timems(now)); POOL_DEBUG(SAT_DEBUG_STATS, "repo size: %d solvables\n", repo->nsolvables); POOL_DEBUG(SAT_DEBUG_STATS, "repo memory used: %d K incore, %d K idarray\n", data->incoredatalen/1024, repo->idarraysize / (int)(1024/sizeof(Id))); }