Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

174 lines (144 sloc) 4.58 kb
/*
* Copyright (c) 2007-2012, Novell Inc.
*
* This program is licensed under the BSD license, read LICENSE.BSD
* for further information
*/
/*
* dataiterator.h
*
*/
#ifndef LIBSOLV_DATAITERATOR_H
#define LIBSOLV_DATAITERATOR_H
#include "pooltypes.h"
#include "pool.h"
struct _Repo;
typedef struct _KeyValue {
Id id;
const char *str;
unsigned int num;
unsigned int num2;
int entry; /* array entry, starts with 0 */
int eof; /* last entry reached */
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
#define SEARCH_STRINGSTART 2
#define SEARCH_STRINGEND 3
#define SEARCH_SUBSTRING 4
#define SEARCH_GLOB 5
#define SEARCH_REGEX 6
#define SEARCH_ERROR 15
#define SEARCH_NOCASE (1<<7)
/* iterator control */
#define SEARCH_NO_STORAGE_SOLVABLE (1<<8)
#define SEARCH_SUB (1<<9)
#define SEARCH_ARRAYSENTINEL (1<<10)
#define SEARCH_DISABLED_REPOS (1<<11)
#define SEARCH_COMPLETE_FILELIST (1<<12)
/* stringification flags */
#define SEARCH_SKIP_KIND (1<<16)
/* By default we stringify just to the basename of a file because
the construction of the full filename is costly. Specify this
flag if you want to match full filenames */
#define SEARCH_FILES (1<<17)
#define SEARCH_CHECKSUMS (1<<18)
/* dataiterator internal */
#define SEARCH_THISSOLVID (1<<31)
/*
* Datamatcher: match a string against a query
*/
typedef struct _Datamatcher {
int flags; /* see matcher flags above */
const char *match; /* the query string */
void *matchdata; /* e.g. compiled regexp */
int error;
} Datamatcher;
int datamatcher_init(Datamatcher *ma, const char *match, int flags);
void datamatcher_free(Datamatcher *ma);
int datamatcher_match(Datamatcher *ma, const char *str);
/*
* Dataiterator
*
* Iterator like interface to 'search' functionality
*
* Dataiterator is per-pool, additional filters can be applied
* to limit the search domain. See dataiterator_init below.
*
* Use these like:
* Dataiterator di;
* dataiterator_init(&di, repo->pool, repo, 0, 0, "bla", SEARCH_SUBSTRING);
* while (dataiterator_step(&di))
* dosomething(di.solvid, di.key, di.kv);
* dataiterator_free(&di);
*/
typedef struct _Dataiterator
{
int state;
int flags;
Pool *pool;
struct _Repo *repo;
struct _Repodata *data;
/* data pointers */
unsigned char *dp;
unsigned char *ddp;
Id *idp;
Id *keyp;
/* the result */
struct _Repokey *key;
KeyValue kv;
/* our matcher */
Datamatcher matcher;
/* iterators/filters */
Id keyname;
Id repodataid;
Id solvid;
Id repoid;
Id keynames[3 + 1];
int nkeynames;
int rootlevel;
/* recursion data */
struct di_parent {
KeyValue kv;
unsigned char *dp;
Id *keyp;
} parents[3];
int nparents;
} Dataiterator;
/*
* Initialize dataiterator
*
* di: Pointer to Dataiterator to be initialized
* pool: Search domain for the iterator
* repo: if non-null, limit search to this repo
* solvid: if non-null, limit search to this solvable
* keyname: if non-null, limit search to this keyname
* match: if non-null, limit search to this match
*/
int dataiterator_init(Dataiterator *di, Pool *pool, struct _Repo *repo, Id p, Id keyname, const char *match, int flags);
void dataiterator_init_clone(Dataiterator *di, Dataiterator *from);
void dataiterator_set_search(Dataiterator *di, struct _Repo *repo, Id p);
void dataiterator_set_keyname(Dataiterator *di, Id keyname);
int dataiterator_set_match(Dataiterator *di, const char *match, int flags);
void dataiterator_prepend_keyname(Dataiterator *di, Id keyname);
void dataiterator_free(Dataiterator *di);
int dataiterator_step(Dataiterator *di);
void dataiterator_setpos(Dataiterator *di);
void dataiterator_setpos_parent(Dataiterator *di);
int dataiterator_match(Dataiterator *di, Datamatcher *ma);
void dataiterator_skip_attribute(Dataiterator *di);
void dataiterator_skip_solvable(Dataiterator *di);
void dataiterator_skip_repo(Dataiterator *di);
void dataiterator_jump_to_solvid(Dataiterator *di, Id solvid);
void dataiterator_jump_to_repo(Dataiterator *di, struct _Repo *repo);
void dataiterator_entersub(Dataiterator *di);
void dataiterator_clonepos(Dataiterator *di, Dataiterator *from);
void dataiterator_seek(Dataiterator *di, int whence);
#define DI_SEEK_STAY (1 << 16)
#define DI_SEEK_CHILD 1
#define DI_SEEK_PARENT 2
#define DI_SEEK_REWIND 3
#endif /* LIBSOLV_DATAITERATOR_H */
Jump to Line
Something went wrong with that request. Please try again.