X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=ext%2Frepo_zyppdb.c;h=5200c2930c278403e1f8ecb3daeeb714590357e8;hb=1a4fc4d68c2a8bd5d027bc2f76d3bfc2c187efea;hp=e31ecc7114e7aa207829779b3cbc1c58e1749405;hpb=87c5e01c975fee7cc5b4b5c180bbad9bfb1f3dbd;p=platform%2Fupstream%2Flibsolv.git diff --git a/ext/repo_zyppdb.c b/ext/repo_zyppdb.c index e31ecc7..5200c29 100644 --- a/ext/repo_zyppdb.c +++ b/ext/repo_zyppdb.c @@ -23,27 +23,26 @@ #include #include #include +#include #include "pool.h" #include "repo.h" #include "util.h" #define DISABLE_SPLIT #include "tools_util.h" -#include "repo_content.h" +#include "repo_zyppdb.h" -//#define DUMPOUT 0 - enum state { - STATE_START, // 0 - STATE_PRODUCT, // 1 - STATE_NAME, // 2 - STATE_VERSION, // 3 - STATE_ARCH, // 4 - STATE_SUMMARY, // 5 - STATE_VENDOR, // 6 - STATE_INSTALLTIME, // 7 - NUMSTATES // 0 + STATE_START, + STATE_PRODUCT, + STATE_NAME, + STATE_VERSION, + STATE_ARCH, + STATE_SUMMARY, + STATE_VENDOR, + STATE_INSTALLTIME, + NUMSTATES }; struct stateswitch { @@ -79,13 +78,12 @@ struct parsedata { struct stateswitch *swtab[NUMSTATES]; enum state sbtab[NUMSTATES]; + struct joindata jd; const char *tmplang; Solvable *solvable; Id handle; - - Id langcache[ID_NUM_INTERNAL]; }; @@ -94,41 +92,23 @@ struct parsedata { * find value for xml attribute * I: txt, name of attribute * I: atts, list of key/value attributes - * I: dup, strdup it * O: pointer to value of matching key, or NULL * */ static inline const char * -find_attr(const char *txt, const char **atts, int dup) +find_attr(const char *txt, const char **atts) { for (; *atts; atts += 2) { if (!strcmp(*atts, txt)) - return dup ? solv_strdup(atts[1]) : atts[1]; + return atts[1]; } return 0; } /* - * create localized tag - */ - -static Id -langtag(struct parsedata *pd, Id tag, const char *language) -{ - if (language && !language[0]) - language = 0; - if (!language || tag >= ID_NUM_INTERNAL) - return pool_id2langid(pd->repo->pool, tag, language, 1); - if (!pd->langcache[tag]) - pd->langcache[tag] = pool_id2langid(pd->repo->pool, tag, language, 1); - return pd->langcache[tag]; -} - - -/* * XML callback: startElement */ @@ -179,27 +159,24 @@ startElement(void *userData, const char *name, const char **atts) case STATE_PRODUCT: { /* parse 'type' */ - const char *type = find_attr("type", atts, 0); + const char *type = find_attr("type", atts); s = pd->solvable = pool_id2solvable(pool, repo_add_solvable(pd->repo)); - repodata_extend(pd->data, s - pool->solvables); pd->handle = s - pool->solvables; if (type) - { - repodata_set_str(pd->data, pd->handle, PRODUCT_TYPE, type); - } + repodata_set_str(pd->data, pd->handle, PRODUCT_TYPE, type); } break; case STATE_VERSION: { - const char *ver = find_attr("ver", atts, 0); - const char *rel = find_attr("rel", atts, 0); - /* const char *epoch = find_attr("epoch", atts, 1); ignored */ - s->evr = makeevr(pd->pool, join2(ver, "-", rel)); + const char *ver = find_attr("ver", atts); + const char *rel = find_attr("rel", atts); + /* const char *epoch = find_attr("epoch", atts); ignored */ + s->evr = makeevr(pd->pool, join2(&pd->jd, ver, "-", rel)); } break; /* ... */ case STATE_SUMMARY: - pd->tmplang = find_attr("lang", atts, 1); + pd->tmplang = join_dup(&pd->jd, find_attr("lang", atts)); break; default: break; @@ -240,14 +217,13 @@ endElement(void *userData, const char *name) pd->solvable = 0; break; case STATE_NAME: - s->name = pool_str2id(pd->pool, join2("product", ":", pd->content), 1); + s->name = pool_str2id(pd->pool, join2(&pd->jd, "product", ":", pd->content), 1); break; case STATE_ARCH: s->arch = pool_str2id(pd->pool, pd->content, 1); break; case STATE_SUMMARY: - repodata_set_str(pd->data, pd->handle, langtag(pd, SOLVABLE_SUMMARY, pd->tmplang), pd->content); - pd->tmplang = solv_free((void *)pd->tmplang); + repodata_set_str(pd->data, pd->handle, pool_id2langid(pd->pool, SOLVABLE_SUMMARY, pd->tmplang, 1), pd->content); break; case STATE_VENDOR: s->vendor = pool_str2id(pd->pool, pd->content, 1); @@ -313,6 +289,11 @@ add_zyppdb_product(struct parsedata *pd, FILE *fp) if (XML_Parse(parser, buf, l, l == 0) == XML_STATUS_ERROR) { pool_debug(pd->pool, SOLV_ERROR, "repo_zyppdb: %s at line %u:%u\n", XML_ErrorString(XML_GetErrorCode(parser)), (unsigned int)XML_GetCurrentLineNumber(parser), (unsigned int)XML_GetCurrentColumnNumber(parser)); + if (pd->solvable) + { + repo_free_solvable(pd->repo, pd->solvable - pd->pool->solvables, 1); + pd->solvable = 0; + } return; } if (l == 0) @@ -328,7 +309,7 @@ add_zyppdb_product(struct parsedata *pd, FILE *fp) * parse each one as a product */ -void +int repo_add_zyppdb_products(Repo *repo, const char *dirpath, int flags) { int i; @@ -339,7 +320,7 @@ repo_add_zyppdb_products(Repo *repo, const char *dirpath, int flags) DIR *dir; FILE *fp; Repodata *data; - + data = repo_add_repodata(repo, flags); memset(&pd, 0, sizeof(pd)); pd.repo = repo; @@ -356,6 +337,8 @@ repo_add_zyppdb_products(Repo *repo, const char *dirpath, int flags) pd.sbtab[sw->to] = sw->from; } + if (flags & REPO_USE_ROOTDIR) + dirpath = pool_prepend_rootdir(repo->pool, dirpath); dir = opendir(dirpath); if (dir) { @@ -363,10 +346,10 @@ repo_add_zyppdb_products(Repo *repo, const char *dirpath, int flags) { if (strlen(entry->d_name) < 3) continue; /* skip '.' and '..' */ - fullpath = join2(dirpath, "/", entry->d_name); + fullpath = join2(&pd.jd, dirpath, "/", entry->d_name); if ((fp = fopen(fullpath, "r")) == 0) { - perror(fullpath); + pool_error(repo->pool, 0, "%s: %s", fullpath, strerror(errno)); continue; } add_zyppdb_product(&pd, fp); @@ -375,11 +358,13 @@ repo_add_zyppdb_products(Repo *repo, const char *dirpath, int flags) } closedir(dir); - solv_free((void *)pd.tmplang); free(pd.content); - join_freemem(); + join_freemem(&pd.jd); + if (flags & REPO_USE_ROOTDIR) + solv_free((char *)dirpath); if (!(flags & REPO_NO_INTERNALIZE)) repodata_internalize(data); + return 0; } /* EOF */