- advance num64 support. For now, we store the high 32 bits in kv->num2 to stay somew...
authorMichael Schroeder <mls@suse.de>
Fri, 16 Mar 2012 13:36:04 +0000 (14:36 +0100)
committerMichael Schroeder <mls@suse.de>
Fri, 16 Mar 2012 13:36:04 +0000 (14:36 +0100)
src/dataiterator.h
src/repo_write.c
src/repodata.c
src/repopack.h
tools/dumpsolv.c
tools/repomdxml2solv.c

index 5a8114a..cf10fd9 100644 (file)
@@ -21,8 +21,8 @@ struct _Repo;
 typedef struct _KeyValue {
   Id id;
   const char *str;
-  int num;
-  int num2;
+  unsigned int num;
+  unsigned int num2;
 
   int entry;   /* array entry, starts with 0 */
   int eof;     /* last entry reached */
@@ -30,6 +30,8 @@ typedef struct _KeyValue {
   struct _KeyValue *parent;
 } KeyValue;
 
+#define SOLV_KV_NUM64(kv) (((unsigned long long)((kv)->num2)) << 32 | (kv)->num)
+
 /* search matcher flags */
 #define SEARCH_STRINGMASK              15
 #define SEARCH_STRING                  1
index 23c2a43..1db6c50 100644 (file)
@@ -426,6 +426,24 @@ data_addideof(struct extdata *xd, Id x, int eof)
   data_addid(xd, (eof ? x: x | 64));
 }
 
+static void 
+data_addid64(struct extdata *xd, unsigned int x, unsigned int hx)
+{
+  if (hx)
+    {    
+      if (hx > 7)
+        {
+          data_addid(xd, (Id)(hx >> 3));
+          xd->buf[xd->len - 1] |= 128; 
+         hx &= 7;
+        }
+      data_addid(xd, (Id)(x | 0x80000000));
+      xd->buf[xd->len - 5] = (x >> 28) | (hx << 4) | 128; 
+    }
+  else 
+    data_addid(xd, (Id)x);
+}
+
 static void
 data_addidarray_sort(struct extdata *xd, Pool *pool, NeedId *needid, Id *ids, Id marker)
 {
@@ -786,7 +804,7 @@ repo_write_adddata(struct cbdata *cbdata, Repodata *data, Repokey *key, KeyValue
        data_addblob(xd, v, 4);
        break;
       case REPOKEY_TYPE_NUM:
-       data_addid(xd, kv->num);
+       data_addid64(xd, kv->num, kv->num2);
        break;
       case REPOKEY_TYPE_DIR:
        id = kv->id;
index a912842..1e87aba 100644 (file)
@@ -692,9 +692,9 @@ repodata_lookup_num(Repodata *data, Id solvid, Id keyname, unsigned int *value)
       || key->type == REPOKEY_TYPE_U32
       || key->type == REPOKEY_TYPE_CONSTANT)
     {
-      kv.num = 0;
+      kv.num = kv.num2 = 0;
       dp = data_fetch(dp, &kv, key);
-      *value = kv.num;
+      *value = kv.num2 ? ~(unsigned int)0 : kv.num;
       return 1;
     }
   return 0;
@@ -1470,7 +1470,7 @@ dataiterator_step(Dataiterator *di)
        case di_enterarray: di_enterarray:
          if (di->key->name == REPOSITORY_SOLVABLES)
            goto di_nextkey;
-         di->ddp = data_read_id(di->ddp, &di->kv.num);
+         di->ddp = data_read_id(di->ddp, (Id *)&di->kv.num);
          di->kv.eof = 0;
          di->kv.entry = -1;
          /* FALLTHROUGH */
index f52678f..6b76665 100644 (file)
@@ -23,7 +23,41 @@ data_read_id(unsigned char *dp, Id *idp)
           *idp = (x << 7) ^ c;
           return dp;
         }
-      x = (x << 7) ^ c ^ 128;
+      x = (x << 7) ^ (c ^ 128);
+    }
+}
+
+static inline unsigned char *
+data_read_num64(unsigned char *dp, unsigned int *low, unsigned int *high)
+{
+  unsigned int x = 0;
+  unsigned long long int xx;
+  unsigned char c;
+  int n;
+
+  *high = 0;
+  for (n = 4; n-- > 0;)
+    {
+      c = *dp++;
+      if (!(c & 0x80))
+       {
+         *low = (x << 7) ^ c;
+         return dp;
+       }
+      x = (x << 7) ^ (c ^ 128);
+    }
+  xx = x;
+  for (;;)
+    {
+      c = *dp++;
+      if (!(c & 0x80))
+       {
+         xx = (xx << 7) ^ c;
+         *low = xx;
+         *high = xx >> 32;
+         return dp;
+       }
+      xx = (xx << 7) ^ (c ^ 128);
     }
 }
 
@@ -69,6 +103,7 @@ data_fetch(unsigned char *dp, KeyValue *kv, Repokey *key)
     case REPOKEY_TYPE_VOID:
       return dp;
     case REPOKEY_TYPE_CONSTANT:
+      kv->num2 = 0;
       kv->num = key->size;
       return dp;
     case REPOKEY_TYPE_CONSTANTID:
@@ -81,9 +116,10 @@ data_fetch(unsigned char *dp, KeyValue *kv, Repokey *key)
     case REPOKEY_TYPE_DIR:
       return data_read_id(dp, &kv->id);
     case REPOKEY_TYPE_NUM:
-      return data_read_id(dp, &kv->num);
+      return data_read_num64(dp, &kv->num, &kv->num2);
     case REPOKEY_TYPE_U32:
-      return data_read_u32(dp, (unsigned int *)&kv->num);
+      kv->num2 = 0;
+      return data_read_u32(dp, &kv->num);
     case REPOKEY_TYPE_MD5:
       kv->str = (const char *)dp;
       return dp + SIZEOF_MD5;
@@ -94,7 +130,7 @@ data_fetch(unsigned char *dp, KeyValue *kv, Repokey *key)
       kv->str = (const char *)dp;
       return dp + SIZEOF_SHA256;
     case REPOKEY_TYPE_BINARY:
-      dp = data_read_id(dp, &kv->num);
+      dp = data_read_id(dp, (Id *)&kv->num);
       kv->str = (const char *)dp;
       return dp + kv->num;
     case REPOKEY_TYPE_IDARRAY:
@@ -105,13 +141,13 @@ data_fetch(unsigned char *dp, KeyValue *kv, Repokey *key)
       return dp + strlen(kv->str) + 1;
     case REPOKEY_TYPE_DIRNUMNUMARRAY:
       dp = data_read_id(dp, &kv->id);
-      dp = data_read_id(dp, &kv->num);
-      return data_read_ideof(dp, &kv->num2, &kv->eof);
+      dp = data_read_id(dp, (Id *)&kv->num);
+      return data_read_ideof(dp, (Id *)&kv->num2, &kv->eof);
     case REPOKEY_TYPE_FIXARRAY:
-      dp = data_read_id(dp, &kv->num);
+      dp = data_read_id(dp, (Id *)&kv->num);
       return data_read_id(dp, &kv->id);
     case REPOKEY_TYPE_FLEXARRAY:
-      return data_read_id(dp, &kv->num);
+      return data_read_id(dp, (Id *)&kv->num);
     default:
       return 0;
     }
@@ -153,8 +189,8 @@ data_skip(unsigned char *dp, int type)
       return dp + 1;
     case REPOKEY_TYPE_BINARY:
       {
-       Id len;
-       dp = data_read_id(dp, &len);
+       unsigned int len;
+       dp = data_read_id(dp, (Id *)&len);
        return dp + len;
       }
     case REPOKEY_TYPE_DIRSTRARRAY:
@@ -237,6 +273,12 @@ data_skip_verify(unsigned char *dp, int type, int maxid, int maxdir)
       while ((*dp) != 0)
         dp++;
       return dp + 1;
+    case REPOKEY_TYPE_BINARY:
+      {
+       unsigned int len;
+       dp = data_read_id(dp, (Id *)&len);
+       return dp + len;
+      }
     case REPOKEY_TYPE_DIRSTRARRAY:
       for (;;)
         {
index c143edd..7a648dd 100644 (file)
@@ -98,20 +98,22 @@ dump_attr(Repo *repo, Repodata *data, Repokey *key, KeyValue *kv)
       printf("%s: (void)\n", keyname);
       break;
     case REPOKEY_TYPE_U32:
-    case REPOKEY_TYPE_NUM:
     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 %d\n", keyname, (unsigned char)kv->str[0], (unsigned char)kv->str[kv->num - 1], 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 %d %d\n", repodata_dir2str(data, kv->id, 0), kv->num, kv->num2);
+      printf("  %s %u %u\n", repodata_dir2str(data, kv->id, 0), kv->num, kv->num2);
       break;
     case REPOKEY_TYPE_DIRSTRARRAY:
       if (!kv->entry)
index 8e7eb0a..9af5e96 100644 (file)
@@ -73,7 +73,8 @@ doquery(Pool *pool, Repo *repo, const char *query)
          printf("%s\n", di.kv.str);
          break;
        case REPOKEY_TYPE_NUM:
-         printf("%d\n", di.kv.num);
+       case REPOKEY_TYPE_CONSTANT:
+         printf("%llu\n", SOLV_KV_NUM64(&di.kv));
          break;
        case REPOKEY_TYPE_MD5:
        case REPOKEY_TYPE_SHA1: