Merge branch 'master' of git@git.opensuse.org:projects/zypp/sat-solver
[platform/upstream/libsolv.git] / src / repo.c
index 32ed192..4fc38b7 100644 (file)
@@ -275,6 +275,8 @@ repo_free(Repo *repo, int reuseids)
   int i;
 
   pool_freewhatprovides(pool);
+  if (repo == pool->installed)
+    pool->installed = 0;
 
   if (reuseids && repo->end == pool->nsolvables)
     {
@@ -332,7 +334,7 @@ repo_sidedata_extend(Repo *repo, void *b, size_t size, Id p, int count)
     { 
       int d = repo->start - p;
       b = sat_extend(b, n, d, size, REPO_SIDEDATA_BLOCK);
-      memmove(b + d * size, b, n * size);
+      memmove((char*)b + d * size, b, n * size);
       memset(b, 0, d * size);
       n += d;
     }     
@@ -340,7 +342,7 @@ repo_sidedata_extend(Repo *repo, void *b, size_t size, Id p, int count)
     { 
       int d = p + count - repo->end;
       b = sat_extend(b, n, d, size, REPO_SIDEDATA_BLOCK);
-      memset(b + n * size, 0, d * size);
+      memset((char*)b + n * size, 0, d * size);
     }     
   return b;
 }
@@ -569,11 +571,8 @@ repo_fix_conflicts(Repo *repo, Offset conflicts)
 struct matchdata
 {
   Pool *pool;
-  const char *match;
   int flags;
-#if 0
-  regex_t regex;
-#endif
+  Datamatcher matcher;
   int stop;
   int (*callback)(void *cbdata, Solvable *s, Repodata *data, Repokey *key, KeyValue *kv);
   void *callback_data;
@@ -583,62 +582,13 @@ int
 repo_matchvalue(void *cbdata, Solvable *s, Repodata *data, Repokey *key, KeyValue *kv)
 {
   struct matchdata *md = cbdata;
-  int flags = md->flags;
 
-  if ((flags & SEARCH_STRINGMASK) != 0)
+  if (md->matcher.match)
     {
-      switch (key->type)
-       {
-       case REPOKEY_TYPE_ID:
-       case REPOKEY_TYPE_IDARRAY:
-         if (data && data->localpool)
-           kv->str = stringpool_id2str(&data->spool, kv->id);
-         else
-           kv->str = id2str(s->repo->pool, kv->id);
-         break;
-       case REPOKEY_TYPE_STR:
-         break;
-       default:
-         return 0;
-       }
-      switch ((flags & SEARCH_STRINGMASK))
-       {
-         case SEARCH_SUBSTRING:
-           if (flags & SEARCH_NOCASE)
-             {
-               if (!strcasestr(kv->str, md->match))
-                 return 0;
-             }
-           else
-             {
-               if (!strstr(kv->str, md->match))
-                 return 0;
-             }
-           break;
-         case SEARCH_STRING:
-           if (flags & SEARCH_NOCASE)
-             {
-               if (strcasecmp(md->match, kv->str))
-                 return 0;
-             }
-           else
-             {
-               if (strcmp(md->match, kv->str))
-                 return 0;
-             }
-           break;
-         case SEARCH_GLOB:
-           if (fnmatch(md->match, kv->str, (flags & SEARCH_NOCASE) ? FNM_CASEFOLD : 0))
-             return 0;
-           break;
-#if 0
-         case SEARCH_REGEX:
-           if (regexec(&md->regexp, kv->str, 0, NULL, 0))
-             return 0;
-#endif
-         default:
-           return 0;
-       }
+      if (!repodata_stringify(md->pool, data, key, kv, md->flags))
+       return 0;
+      if (!datamatcher_match(&md->matcher, kv->str))
+       return 0;
     }
   md->stop = md->callback(md->callback_data, s, data, key, kv);
   return md->stop;
@@ -819,7 +769,7 @@ repo_search_md(Repo *repo, Id p, Id keyname, struct matchdata *md)
        }
       if (data->state == REPODATA_ERROR)
        continue;
-      repodata_search(data, p, keyname, repo_matchvalue, md);
+      repodata_search(data, p, keyname, md->flags, repo_matchvalue, md);
       if (md->stop > SEARCH_NEXT_KEY)
        break;
     }
@@ -832,11 +782,14 @@ repo_search(Repo *repo, Id p, Id keyname, const char *match, int flags, int (*ca
 
   memset(&md, 0, sizeof(md));
   md.pool = repo->pool;
-  md.match = match;
   md.flags = flags;
   md.callback = callback;
   md.callback_data = cbdata;
+  if (match)
+    datamatcher_init(&md.matcher, match, flags);
   repo_search_md(repo, p, keyname, &md);
+  if (match)
+    datamatcher_free(&md.matcher);
 }
 
 const char *
@@ -859,7 +812,7 @@ repo_lookup_str(Repo *repo, Id entry, Id keyname)
     }
   for (i = 0, data = repo->repodata; i < repo->nrepodata; i++, data++)
     {
-      if (entry && (entry < data->start || entry >= data->end))
+      if (entry != SOLVID_META && (entry < data->start || entry >= data->end))
        continue;
       if (!repodata_precheck_keyname(data, keyname))
        continue;
@@ -881,13 +834,13 @@ repo_lookup_num(Repo *repo, Id entry, Id keyname, unsigned int notfound)
 
   if (keyname == RPM_RPMDBID)
     {
-      if (repo->rpmdbid && entry && entry >= repo->start && entry < repo->end)
+      if (repo->rpmdbid && entry >= repo->start && entry < repo->end)
        return repo->rpmdbid[entry - repo->start];
       return notfound;
     }
   for (i = 0, data = repo->repodata; i < repo->nrepodata; i++, data++)
     {
-      if (entry && (entry < data->start || entry >= data->end))
+      if (entry != SOLVID_META && (entry < data->start || entry >= data->end))
        continue;
       if (!repodata_precheck_keyname(data, keyname))
        continue;
@@ -926,7 +879,7 @@ repo_lookup_id(Repo *repo, Id entry, Id keyname)
     }   
   for (i = 0, data = repo->repodata; i < repo->nrepodata; i++, data++)
     {   
-      if (entry && (entry < data->start || entry >= data->end))
+      if (entry != SOLVID_META && (entry < data->start || entry >= data->end))
        continue;
       if (!repodata_precheck_keyname(data, keyname))
        continue;
@@ -954,7 +907,7 @@ repo_lookup_bin_checksum(Repo *repo, Id entry, Id keyname, Id *typep)
   int i, j;
   for (i = 0, data = repo->repodata; i < repo->nrepodata; i++, data++)
     {
-      if (entry && (entry < data->start || entry >= data->end))
+      if (entry != SOLVID_META && (entry < data->start || entry >= data->end))
        continue;
       if (!repodata_precheck_keyname(data, keyname))
        continue;
@@ -979,7 +932,7 @@ repo_lookup_void(Repo *repo, Id entry, Id keyname)
   int i, j;
   for (i = 0, data = repo->repodata; i < repo->nrepodata; i++, data++)
     {
-      if (entry && (entry < data->start || entry >= data->end))
+      if (entry != SOLVID_META && (entry < data->start || entry >= data->end))
        continue;
       if (!repodata_precheck_keyname(data, keyname))
        continue;