3 #define _RPMIOB_INTERNAL
10 #define _RPMSQL_INTERNAL
11 #define _RPMVT_INTERNAL
12 #define _RPMVC_INTERNAL
18 #define _RPMTAG_INTERNAL
34 {
"blob", SQLITE_BLOB },
35 {
"float", SQLITE_FLOAT },
36 {
"int", SQLITE_INTEGER },
37 {
"integer",SQLITE_INTEGER },
38 {
"null", SQLITE_NULL },
39 {
"text", SQLITE_TEXT },
58 #define RPM_MIN_TYPE 2
59 #define RPM_MAX_TYPE 9
60 #define RPM_MASK_TYPE 0x0000ffff
76 static KEY tagTypes[] = {
96 const char * k = sqlTypes[
i].
k;
97 const char * se = strcasestr(s, k);
98 if (se == NULL || se <= s || se[-1] !=
' ')
101 if (*se && *se !=
' ')
111 static char *
tagJoin(
const char * a,
const char ** argv,
const char * z)
113 static const char _type[] =
" TEXT";
115 size_t na = (
sizeof(
"\t")-1) + (a ? strlen(a) : 0);
117 size_t nz = (z ? strlen(z) : 0) + strlen(_type) + (
sizeof(
",\n")-1);
120 for (av = argv; *av != NULL; av++)
121 nb += na + strlen(*av) + nz;
123 te = t = (
char *)
xmalloc(nb + 1);
124 for (av = argv; *av != NULL; av++) {
141 char * h =
tagJoin(
"", av,
"");
147 av = (
const char **) (vt->argc > 3 ? &vt->argv[3] : vt->fields);
150 u[strlen(u)-2] =
' ';
153 #define dbN vt->argv[1]
154 #define tblN vt->argv[2]
163 fprintf(stderr,
"%s\n", hu);
169 sqlite3 *
db = (sqlite3 *) vt->db;
177 SQLDBG((stderr,
"--> %s(%p,%p)\n", __FUNCTION__, vt, vtp));
182 {
static const char * _empty[] = { NULL };
185 sqlite3_declare_vtab(db, hu));
191 const struct headerTagTableEntry_s * tbl;
201 for (tbl = _rpmTagTable; tbl && tbl->name; tbl++) {
202 const char *
name = tbl->name + (
sizeof(
"RPMTAG_")-1);
208 snprintf(tag,
sizeof(tag),
"%d", tbl->val);
209 snprintf(attrs,
sizeof(attrs),
"%d", (tbl->type >> 16));
211 t =
rpmExpand(tag, vd->split, attrs, vd->split, tagTypes[tx].
k,
212 vd->split, name, NULL);
219 for (ext = exts, extNum = 0; ext != NULL && ext->type != HEADER_EXT_LAST;
220 ext = (ext->type == HEADER_EXT_MORE ? *ext->u.more : ext+1), extNum++)
222 if (ext->name == NULL || ext->type != HEADER_EXT_TAG)
228 fprintf(fp,
"%s\n", ext->name + 7);
244 (void) rpmvtFree(vt);
252 SQLDBG((stderr,
"<-- %s(%p,%p) rc %d\n", __FUNCTION__, vt, vtp, rc));
261 .parse =
"tag integer primary key|attrs integer|type|name",
265 int argc,
const char *
const * argv,
266 rpmvt * vtp,
char ** pzErr)
280 static char *
_rpmvtJoin(
const char * a,
const char ** argv,
const char * z)
282 static const char _type[] =
" TEXT";
284 size_t na = (
sizeof(
"\t")-1) + (a ? strlen(a) : 0);
286 size_t nz = (z ? strlen(z) : 0) + strlen(_type) + (
sizeof(
",\n")-1);
289 for (av = argv; *av != NULL; av++)
290 nb += na + strlen(*av) + nz;
292 te = t = (
char *)
xmalloc(nb + 1);
293 for (av = argv; *av != NULL; av++) {
315 av = (
const char **) (vt->argc > 4 ? &vt->argv[4] : vt->fields);
318 u[strlen(u)-2] =
' ';
321 #define dbN vt->argv[1]
322 #define tblN vt->argv[2]
331 fprintf(stderr,
"%s\n", hu);
337 sqlite3 *
db = (sqlite3 *) vt->db;
340 static const char * hidden[] = {
"path HIDDEN",
"id HIDDEN", NULL };
346 const char * fn = NULL;
353 fprintf(stderr,
"--> %s(%p,%p)\n", __FUNCTION__, vt, vtp);
360 sqlite3_declare_vtab(
db, hu));
365 static char _quotes[] =
"'\"";
366 int quoted = (strchr(_quotes, *vt->argv[3]) != NULL);
368 const char * path = NULL;
370 (void)
urlPath(vt->argv[3]+quoted, &path);
371 prefix = (*path !=
'/' && vd->prefix ? vd->prefix :
"");
373 uri[strlen(uri)-quoted] =
'\0';
377 (void)
urlPath(uri, (
const char **) &fn);
379 if (!strcasecmp(vt->argv[0],
"nixdb")) {
381 "select path from ValidPaths where glob('", fn,
"', path);",
389 fprintf(stderr,
"*** uri %s fn %s\n", uri, fn);
391 const char ** av = NULL;
396 fprintf(stderr,
"GLOB: %d = Glob(%s) av %p[%d]\n", xx, uri, av, ac);
398 rc = SQLITE_NOTFOUND;
403 if (uri[strlen(uri)-1] ==
'/') {
407 fprintf(stderr,
" DIR: %p = Opendir(%s)\n", dir, uri);
409 rc = SQLITE_NOTFOUND;
411 while ((dp =
Readdir(dir)) != NULL) {
412 if (!strcmp(dp->d_name,
".") || !strcmp(dp->d_name,
".."))
420 if (!
Lstat(uri, &sb)) {
424 fprintf(stderr,
"FILE: %d = Slurp(%s)\n", xx, uri);
428 rc = SQLITE_NOTFOUND;
431 rc = SQLITE_NOTFOUND;
433 if (!strcasecmp(vt->argv[0],
"Env")) {
435 fprintf(stderr,
" ENV: getenv(%p[%d])\n", &vt->argv[3],
argvCount(&vt->argv[3]));
436 for (i = 3; i < vt->argc; i++) {
444 fprintf(stderr,
"LIST: %d = Append(%p[%d])\n", xx, &vt->argv[3],
argvCount(&vt->argv[3]));
459 (void) rpmvtFree(vt);
468 fprintf(stderr,
"<-- %s(%p,%p) rc %d\n", __FUNCTION__, vt, vtp, rc);
476 sqlite3_context * pContext = (sqlite3_context *) _pContext;
478 const char * path = vt->av[vc->ix];
479 const char * col = vt->cols[colx];
486 fprintf(stderr,
"--> %s(%p,%p,%d)\n", __FUNCTION__, vc, pContext, colx);
488 if (!strcmp(col,
"path"))
489 sqlite3_result_text(pContext, path, -1, SQLITE_STATIC);
498 sqlite3_result_null(pContext);
501 fprintf(stderr,
"*** tag %u t %u p.ptr %p c %u\n", he->
tag, he->
t, he->
p.
ptr, he->
c);
505 sqlite3_result_int(pContext, he->
p.
ui8p[0]);
508 sqlite3_result_int(pContext, he->
p.
ui16p[0]);
511 sqlite3_result_int(pContext, he->
p.
ui32p[0]);
514 sqlite3_result_int64(pContext, he->
p.
ui64p[0]);
517 sqlite3_result_blob(pContext, he->
p.
ptr, he->
c, SQLITE_TRANSIENT);
520 #if !defined(SUPPORT_I18NSTRING_TYPE)
524 sqlite3_result_text(pContext, he->
p.
str, -1, SQLITE_TRANSIENT);
527 sqlite3_result_text(pContext, he->
p.
argv[0], -1, SQLITE_TRANSIENT);
535 fprintf(stderr,
"<-- %s(%p,%p,%d) rc %d\n", __FUNCTION__, vc, pContext, colx, rc);
554 if (vc->ix >= 0 && vc->ix < vc->nrows) {
569 sqlite3_value ** argv = (sqlite3_value **) _argv;
573 fprintf(stderr,
"--> %s(%p,%d,%s,%p[%u]) [%d:%d]\n", __FUNCTION__, vc, idxNum, idxStr, argv, (
unsigned)argc, vc->ix, vc->nrows);
581 fprintf(stderr,
"<-- %s(%p,%d,%s,%p[%u]) [%d:%d] rc %d\n", __FUNCTION__, vc, idxNum, idxStr, argv, (
unsigned)argc, vc->ix, vc->nrows, rc);
590 if (vc->ix >= 0 && vc->ix < vc->nrows) {
596 if (!(vc->ix >= 0 && vc->ix < vc->nrows))
598 fprintf(stderr,
"<-- %s(%p) [%d:%d] rc %d\n", __FUNCTION__, vc, vc->ix, vc->nrows, rc);
605 int rc = (vc->ix >= 0 && vc->ix < vc->nrows ? 0 : 1);
608 fprintf(stderr,
"<-- %s(%p) h %p rc %d\n", __FUNCTION__, vc, vt->_h, rc);
616 .prefix =
"%{?_repodb}%{!?_repodb:/X/popt/}",
618 .parse =
"Name|Epoch integer|Version|Release|Arch|Os|Providename|Provideversion|Provideflags|Sigmd5 blob|Nvra|Summary",
622 int argc,
const char *
const * argv,
623 rpmvt * vtp,
char ** pzErr)
647 (void) rpmvtFree(vt);
666 static struct rpmsqlVMT_s
__VMT[] = {
676 fprintf(stderr,
"--> %s(%p)\n", __FUNCTION__, _db);
677 rc = _rpmsqlLoadVMT(_db, __VMT);
678 fprintf(stderr,
"<-- %s(%p) rc %d\n", __FUNCTION__, _db, rc);
headerTagTableEntry rpmTagTable
Automatically generated table of tag name/value pairs.
char * getenv(const char *name)
rpmgi rpmgiFree(rpmgi gi)
Destroy a generalized iterator.
static char * _rpmvtAppendCols(rpmvt vt, const char **av)
char * rpmGetPath(const char *path,...)
Return (malloc'ed) expanded, canonicalized, file path.
static int hdrFilter(rpmvc vc, int idxNum, const char *idxStr, int argc, rpmvArg *_argv)
struct sqlite3_module hdrModule
struct headerToken_s * Header
static int tagCreate(void *_db, void *pAux, int argc, const char *const *argv, rpmvt *vtp, char **pzErr)
int argvAppend(ARGV_t *argvp, ARGV_t av)
Append one argv array to another.
int rpmsqlCmd(rpmsql sql, const char *msg, void *_db, int rc)
Check sqlite3 return code, displaying error messages.
Header rpmgiHeader(rpmgi gi)
Return current iteration header.
static struct rpmsqlVMT_s __VMT[]
rpmiob rpmiobFree(rpmiob iob)
Destroy a I/O buffer instance.
static int hdrNext(rpmvc vc)
static struct rpmvd_s _hdrVD
rpmTag tagValue(const char *tagstr)
Return tag value from name.
int rpmiobSlurp(const char *fn, rpmiob *iobp)
int sqlite3_extension_init(void *_db)
rpmTagType_e
The basic types of data in tags from headers.
int rpmGlob(const char *patterns, int *argcPtr, const char ***argvPtr)
Return URL path(s) from a (URL prefixed) pattern glob.
rpmgi rpmgiNew(rpmts ts, int tag, const void *keyp, size_t keylen)
Return a generalized iterator.
rpmvt rpmvtNew(void *db, void *pModule, const char *const *argv, rpmvd vd)
int argvCount(const ARGV_t argv)
Return no.
int Lstat(const char *path, struct stat *st)
lstat(2) clone.
static const struct headerTagTableEntry_s _rpmTagTable[]
ARGV_t argvFree(ARGV_t argv)
Destroy an argv array.
int Glob_pattern_p(const char *pattern, int quote)
glob_pattern_p(3) clone.
rpmRC rpmgiSetArgs(rpmgi gi, ARGV_t argv, int ftsOpts, rpmgiFlags flags)
Load iterator args.
int argvAdd(ARGV_t *argvp, ARGstr_t val)
Add a string to an argv array.
const struct headerSprintfExtension_s * headerSprintfExtension
Header headerFree(Header h)
Dereference a header instance.
char * rpmExpand(const char *arg,...)
Return (malloc'ed) concatenated macro expansion(s).
static int hdrLoadNext(rpmvc vc)
void argvPrint(const char *msg, ARGV_t argv, FILE *fp)
Print argv array elements.
static int hdrCreate(void *_db, void *pAux, int argc, const char *const *argv, rpmvt *vtp, char **pzErr)
Header headerLink(Header h)
Reference a header instance.
static int _rpmvtLoadArgv(rpmvt vt, rpmvt *vtp)
struct rpmgi_s * rpmgi
Generalized iterator.
enum rpmRC_e rpmRC
RPM return codes.
char * rpmiobStr(rpmiob iob)
Return I/O buffer (as string).
static const char * hasSqlType(const char *s)
static int tagLoadArgv(rpmvt vt, rpmvt *vtp)
urltype urlPath(const char *url, const char **pathp)
Return path component of URL.
static int snprintf(char *buf, int nb, const char *fmt,...)
static const char * prefix[]
Tables for prefixing and suffixing patterns, according to the -w, -x, and -F options.
const char const bson const bson bson * out
rpmts rpmtsFree(rpmts ts)
Destroy transaction set, closing the database as well.
struct dirent * Readdir(DIR *dir)
readdir(3) clone.
rpmts rpmtsCreate(void)
Create an empty transaction set.
static char * _rpmvtJoin(const char *a, const char **argv, const char *z)
char * stpcpy(char *dest, const char *src)
struct rpmts_s * rpmts
The RPM Transaction Set.
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
Structures and prototypes used for an "rpmts" transaction set.
const struct headerTagTableEntry_s * headerTagTableEntry
static struct rpmvd_s _tagVD
int argvSplit(ARGV_t *argvp, const char *str, const char *seps)
Split a string into an argv array.
static int hdrEof(rpmvc vc)
rpmRC rpmgiNext(rpmgi gi)
Perform next iteration step.
int Closedir(DIR *dir)
closedir(3) clone.
static int hdrDestroy(rpmvt vt)
DIR * Opendir(const char *path)
opendir(3) clone.
static char * tagJoin(const char *a, const char **argv, const char *z)
static int hdrColumn(rpmvc vc, void *_pContext, int colx)
static char * tagAppendCols(rpmvt vt, const char **av)
struct sqlite3_module tagModule
headerSprintfExtension headerCompoundFormats
Supported default header extension/tag output formats.