32 #define INTERESTED_START SOLVABLE_NAME
33 #define INTERESTED_END SOLVABLE_ENHANCES
35 #define SOLV_ERROR_NOT_SOLV 1
36 #define SOLV_ERROR_UNSUPPORTED 2
37 #define SOLV_ERROR_EOF 3
38 #define SOLV_ERROR_ID_RANGE 4
39 #define SOLV_ERROR_OVERFLOW 5
40 #define SOLV_ERROR_CORRUPT 6
62 for (i = 0; i < 4; i++)
111 for (i = 0; i < 5; i++)
131 x = (x << 7) ^ c ^ 128;
158 x = (x << 7) ^ c ^ 128;
161 x = (x << 6) | (c & 63);
202 static inline unsigned char *
213 *ret = map ? map[x] : x;
217 static unsigned char *
229 x = (x << 7) ^ c ^ 128;
232 x = (x << 6) | (c & 63);
249 static unsigned char *
262 x = (x << 7) ^ c ^ 128;
265 x = (x << 6) | (c & 63);
283 *store++ = map ? map[x] : x;
300 #define INCORE_ADD_CHUNK 8192
301 #define DATA_READ_CHUNK 8192
319 *dp++ = (x >> 28) | 128;
321 *dp++ = (x >> 21) | 128;
322 *dp++ = (x >> 14) | 128;
325 *dp++ = (x >> 7) | 128;
355 if (max &&
id >= max)
363 id = (
id & 63) | ((
id & ~63) << 1);
391 incore_add_u8(
Repodata *data,
unsigned int x)
421 unsigned int numid, numrel, numdir, numsolv;
422 unsigned int numkeys, numschemata;
430 unsigned int hashmask, h;
436 unsigned int size_idarray;
437 Id *idarraydatap, *idarraydataend;
440 unsigned int solvflags;
441 unsigned int solvversion;
443 Id *schemadata, *schemadatap, *schemadataend;
444 Id *schemata, key, *keyp;
447 int maxsize, allsize;
448 unsigned char *buf, *bufend, *dp, *dps;
469 memset(&data, 0,
sizeof(data));
476 if (
read_u32(&data) != (
'S' << 24 |
'O' << 16 |
'L' << 8 |
'V'))
501 if (numdir && numdir < 2)
512 if (parent && numsolv)
515 if (parent->
end - parent->
start != numsolv)
517 pool_debug(pool,
SAT_ERROR,
"sub-repository solvable number does not match main repository (%d - %d)\n", parent->
end - parent->
start, numsolv);
520 for (i = 0; i < numsolv; i++)
542 if (!(flags & REPO_LOCALPOOL))
572 if (sizeid && fread(strsp, sizeid, 1, fp) != 1)
580 unsigned int pfsize =
read_u32(&data);
587 if (pfsize && fread(prefix, pfsize, 1, fp) != 1)
593 for (i = 1; i < numid; i++)
595 int same = (
unsigned char)*pp++;
596 size_t len = strlen(pp) + 1;
597 freesp -= same + len;
605 memcpy(dest, old_str, same);
606 memcpy(dest + same, pp, len);
621 if ((flags & REPO_LOCALPOOL) != 0)
633 for (i = 1; i < spool->
nstrings; i++)
635 if (sp >= strsp + sizeid)
641 sp += strlen(sp) + 1;
669 for (i = 1; i < spool->
nstrings; i++)
684 for (i = 1; i < numid; i++)
686 if (sp >= strsp + sizeid)
755 for (i = 1; i < pool->
nrels; i++)
757 h =
relhash(ran[i].name, ran[i].evr, ran[i].flags) & hashmask;
768 for (i = 0; i < numrel; i++)
770 name =
read_id(&data, i + numid);
771 evr =
read_id(&data, i + numid);
775 h =
relhash(name, evr, relflags) & hashmask;
782 if (ran[
id].name == name && ran[
id].evr == evr && ran[
id].flags == relflags)
792 ran[id].
flags = relflags;
808 for (i = 2; i < numdir; i++)
810 id =
read_id(&data, i + numid);
824 for (i = 1; i < numkeys; i++)
829 else if ((flags & REPO_LOCALPOOL) != 0)
834 else if ((flags & REPO_LOCALPOOL) != 0)
836 if (type < REPOKEY_TYPE_VOID || type > REPOKEY_TYPE_FLEXARRAY)
840 type = REPOKEY_TYPE_VOID;
844 keys[i].
size =
read_id(&data, keys[i].type == REPOKEY_TYPE_CONSTANTID ? numid + numrel : 0);
854 if (
id >= SOLVABLE_NAME &&
id <= RPM_RPMDBID)
858 pool_debug(pool,
SAT_ERROR,
"main solvable data must use incore storage%d\n", keys[i].storage);
869 if (keys[i].type == REPOKEY_TYPE_CONSTANTID && idmap)
872 fprintf(stderr,
"key %d %s %s %d %d\n", i,
id2str(pool,
id),
id2str(pool, keys[i].type),
873 keys[i].size, keys[i].storage);
877 have_xdata = parent ? 1 : 0;
878 for (i = 1; i < numkeys; i++)
883 data.
nkeys = numkeys;
884 for (i = 1; i < numkeys; i++)
887 data.
keybits[(
id >> 3) & (
sizeof(data.
keybits) - 1)] |= 1 << (
id & 7);
894 schemadatap = schemadata + 1;
895 schemadataend = schemadatap + id;
897 for (i = 1; i < numschemata; i++)
899 schemata[i] = schemadatap - schemadata;
900 schemadatap =
read_idarray(&data, numid, 0, schemadatap, schemadataend);
902 Id *sp = schemadata + schemata[i];
903 fprintf(stderr,
"schema %d:", i);
905 fprintf(stderr,
" %d", *sp);
906 fprintf(stderr,
"\n");
916 idarraydatap = idarraydataend = 0;
922 if (maxsize > allsize)
934 if (!l || fread(buf, l, 1, data.
fp) != 1)
949 keyp = schemadata + schemata[id];
951 for (i = 0; keyp[i]; i++)
963 if (keydepth == 0 || needchunk)
965 int left = bufend - dp;
978 memmove(buf, dp, left);
984 if (l && fread(buf + left, l, 1, data.
fp) != 1)
993 if (allsize + left < maxsize)
994 maxsize = allsize + left;
1002 printf(
"key %d at %d\n", key, (
int)(keyp - 1 - schemadata));
1010 if (s && keydepth == 3)
1016 id = stack[keydepth - 1];
1022 keyp = schemadata + schemata[id];
1029 keyp = schemadata + stack[--keydepth];
1030 nentries = stack[--keydepth];
1032 printf(
"pop flexarray %d %d\n", keydepth, nentries);
1043 printf(
"=> %s %s %p\n",
id2str(pool, keys[key].name),
id2str(pool, keys[key].type), s);
1045 id = keys[key].
name;
1054 switch (keys[key].type)
1056 case REPOKEY_TYPE_ID:
1058 if (s &&
id == SOLVABLE_NAME)
1060 else if (s &&
id == SOLVABLE_ARCH)
1062 else if (s &&
id == SOLVABLE_EVR)
1064 else if (s &&
id == SOLVABLE_VENDOR)
1072 case REPOKEY_TYPE_U32:
1077 if (s &&
id == RPM_RPMDBID)
1086 case REPOKEY_TYPE_IDARRAY:
1087 case REPOKEY_TYPE_REL_IDARRAY:
1091 dp =
data_skip(dp, REPOKEY_TYPE_IDARRAY);
1101 if (keys[key].type == REPOKEY_TYPE_IDARRAY)
1103 else if (
id == SOLVABLE_REQUIRES)
1105 else if (
id == SOLVABLE_PROVIDES)
1109 if (idarraydatap > idarraydataend)
1115 if (
id == SOLVABLE_PROVIDES)
1117 else if (
id == SOLVABLE_OBSOLETES)
1119 else if (
id == SOLVABLE_CONFLICTS)
1121 else if (
id == SOLVABLE_REQUIRES)
1123 else if (
id == SOLVABLE_RECOMMENDS)
1125 else if (
id == SOLVABLE_SUPPLEMENTS)
1127 else if (
id == SOLVABLE_SUGGESTS)
1129 else if (
id == SOLVABLE_ENHANCES)
1137 case REPOKEY_TYPE_FIXARRAY:
1138 case REPOKEY_TYPE_FLEXARRAY:
1141 if (keydepth ==
sizeof(stack)/
sizeof(*stack))
1147 stack[keydepth++] = nentries;
1148 stack[keydepth++] = keyp - schemadata;
1149 stack[keydepth++] = 0;
1156 nentries = stack[--keydepth];
1159 if (keydepth == 3 &&
id == REPOSITORY_SOLVABLES)
1162 if (nentries != numsolv)
1164 pool_debug(pool,
SAT_ERROR,
"inconsistent number of solvables: %d %d\n", nentries, numsolv);
1181 for (i = 1; i < numkeys; i++)
1184 if ((keys[i].type == REPOKEY_TYPE_IDARRAY || keys[i].type == REPOKEY_TYPE_REL_IDARRAY)
1186 size_idarray += keys[i].
size;
1193 idarraydataend = idarraydatap + size_idarray;
1201 if (keys[key].type == REPOKEY_TYPE_FIXARRAY)
1208 stack[keydepth - 1] = id;
1210 keyp = schemadata + schemata[id];
1255 for (i = 1; i < numkeys; i++)
1258 if (i < numkeys && !data.
error)
1261 unsigned int pagesize;
1265 for (i = 1; i < numkeys; i++)
1269 fileoffset += keys[i].
size;
1305 for (key = 1 ; key < data.
nkeys; key++)
1306 if (data.
keys[key].
name == REPOSITORY_EXTERNAL && data.
keys[key].
type == REPOKEY_TYPE_FLEXARRAY)
1308 if (key < data.
nkeys)