return rc;
}
+dbiIndexType dbiType(dbiIndex dbi)
+{
+ return dbi->dbi_type;
+}
+
int dbiStat(dbiIndex dbi, unsigned int flags)
{
DB * db = dbi->dbi_db;
dbi->dbi_rpmdb = rpmdb;
dbi->dbi_rpmtag = rpmtag;
dbi->dbi_file = rpmTagGetName(rpmtag);
-
- /*
- * Inverted lists have join length of 2, primary data has join length of 1.
- */
- switch (rpmtag) {
- case RPMDBI_PACKAGES:
- dbi->dbi_jlen = 1 * sizeof(int32_t);
- break;
- default:
- dbi->dbi_jlen = 2 * sizeof(int32_t);
- break;
- }
-
+ dbi->dbi_type = (rpmtag == RPMDBI_PACKAGES) ? DBI_PRIMARY : DBI_SECONDARY;
dbi->dbi_byteswapped = -1; /* -1 unknown, 0 native order, 1 alien order */
if (!dbi->dbi_use_dbenv) { /* dbenv is always used now. */
#ifndef _DBI_H
#define _DBI_H
+
typedef struct _dbiIndex * dbiIndex;
+/* Type of the dbi, also serves as the join key size */
+typedef enum dbiIndexType_e {
+ DBI_PRIMARY = (1 * sizeof(int32_t)),
+ DBI_SECONDARY = (2 * sizeof(int32_t)),
+} dbiIndexType;
+
/** \ingroup dbi
* Describes an index database (implemented on Berkeley db functionality).
*/
rpmdb dbi_rpmdb; /*!< the parent rpm database */
rpmTag dbi_rpmtag; /*!< rpm tag used for index */
- int dbi_jlen; /*!< size of join key */
+ dbiIndexType dbi_type; /*! Type of dbi (primary / index) */
DB * dbi_db; /*!< Berkeley DB * handle */
DB_TXN * dbi_txnid; /*!< Bekerley DB_TXN * transaction id */
RPM_GNUC_INTERNAL
int dbiStat(dbiIndex dbi, unsigned int flags);
+/** \ingroup dbi
+ * Type of dbi (primary data / index)
+ * @param dbi index database handle
+ * @return type of dbi
+ */
+RPM_GNUC_INTERNAL
+dbiIndexType dbiType(dbiIndex dbi);
+
#endif /* _DBI_H */
const char * sdbir;
dbiIndexSet set;
unsigned int i;
+ dbiIndexType itype = dbiType(dbi);
if (dbi == NULL || data == NULL || setp == NULL)
return -1;
}
set = xcalloc(1, sizeof(*set));
- dbiGrowSet(set, data->size / dbi->dbi_jlen);
- set->count = data->size / dbi->dbi_jlen;
+ dbiGrowSet(set, data->size / itype);
+ set->count = data->size / itype;
- switch (dbi->dbi_jlen) {
+ switch (itype) {
default:
- case 2*sizeof(int32_t):
+ case DBI_SECONDARY:
for (i = 0; i < set->count; i++) {
union _dbswap hdrNum, tagNum;
set->recs[i].tagNum = tagNum.ui;
}
break;
- case 1*sizeof(int32_t):
+ case DBI_PRIMARY:
for (i = 0; i < set->count; i++) {
union _dbswap hdrNum;
int _dbbyteswapped = dbiByteSwapped(dbi);
char * tdbir;
unsigned int i;
+ dbiIndexType itype = dbiType(dbi);
if (dbi == NULL || data == NULL || set == NULL)
return -1;
- data->size = set->count * (dbi->dbi_jlen);
+ data->size = set->count * itype;
if (data->size == 0) {
data->data = NULL;
return 0;
}
tdbir = data->data = xmalloc(data->size);
- switch (dbi->dbi_jlen) {
+ switch (itype) {
default:
- case 2*sizeof(int32_t):
+ case DBI_SECONDARY:
for (i = 0; i < set->count; i++) {
union _dbswap hdrNum, tagNum;
tdbir += sizeof(tagNum.ui);
}
break;
- case 1*sizeof(int32_t):
+ case DBI_PRIMARY:
for (i = 0; i < set->count; i++) {
union _dbswap hdrNum;