/** * Return rpmdb match iterator with filters (if any) set. * @param gi generalized iterator * @returns RPMRC_OK on success */ static rpmRC rpmgiInitFilter(rpmgi gi) /*@globals rpmGlobalMacroContext, h_errno, internalState @*/ /*@modifies gi, rpmGlobalMacroContext, h_errno, internalState @*/ { rpmRC rpmrc = RPMRC_OK; ARGV_t av; int got = 0; gi->mi = rpmtsInitIterator(gi->ts, gi->tag, gi->keyp, gi->keylen); if (_rpmgi_debug < 0) fprintf(stderr, "*** gi %p key %p[%d]\tmi %p\n", gi, gi->keyp, (int)gi->keylen, gi->mi); if (gi->argv != NULL) for (av = (const char **) gi->argv; *av != NULL; av++) { if (gi->tag == RPMDBI_PACKAGES) { int tag = RPMTAG_NAME; const char * pat; char * a, * ae; pat = a = xstrdup(*av); tag = RPMTAG_NAME; /* Parse for "tag=pattern" args. */ if ((ae = strchr(a, '=')) != NULL) { *ae++ = '\0'; if (*a != '\0') { /* XXX HACK: permit '=foo' */ tag = tagValue(a); #ifdef DYING /* XXX arbitrary tags always have a return value */ if (tag < 0) { rpmlog(RPMLOG_NOTICE, _("unknown tag: \"%s\"\n"), a); got = -1; } #endif } pat = ae; got++; } if (got) { if (_rpmgi_debug < 0) fprintf(stderr, "\tav %p[%d]: \"%s\" -> %s ~= \"%s\"\n", gi->argv, (int)(av - gi->argv), *av, tagName(tag), pat); got = rpmmiAddPattern(gi->mi, tag, RPMMIRE_DEFAULT, pat); } a = _free(a); } if (got >= 0) continue; gi->mi = rpmmiFree(gi->mi); /* XXX odd side effect? */ rpmrc = RPMRC_FAIL; break; } return rpmrc; }
static VALUE rpmmi_pattern(int argc, VALUE *argv, VALUE s) { rpmmi mi = rpmmi_ptr(s); VALUE v_tag, v_pattern; rb_scan_args(argc, argv, "20", &v_tag, &v_pattern); rpmmiAddPattern(mi, FIX2INT(v_tag), RPMMIRE_REGEX, StringValueCStr(v_pattern)); return Qtrue; }
/*@null@*/ static PyObject * rpmmi_Pattern(rpmmiObject * s, PyObject * args, PyObject * kwds) /*@globals rpmGlobalMacroContext, _Py_NoneStruct @*/ /*@modifies s, rpmGlobalMacroContext, _Py_NoneStruct @*/ { PyObject *TagN = NULL; int type; char * pattern; rpmTag tag; char * kwlist[] = {"tag", "type", "pattern", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "Ois:Pattern", kwlist, &TagN, &type, &pattern)) return NULL; if ((tag = tagNumFromPyObject (TagN)) == (rpmTag)-1) { PyErr_SetString(PyExc_TypeError, "unknown tag type"); return NULL; } rpmmiAddPattern(s->mi, tag, type, pattern); Py_RETURN_NONE; }