Skip to content

Commit

Permalink
allow SOLVID_META queries through SOLVID_POS
Browse files Browse the repository at this point in the history
Add 'meta' attribute in repo bindings and get rid of no longer neededed
lookup methods.
  • Loading branch information
mlschroe committed May 17, 2013
1 parent 64ff7df commit 0424ef2
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 42 deletions.
40 changes: 31 additions & 9 deletions bindings/solv.i
Expand Up @@ -1235,6 +1235,7 @@ typedef struct {
return 0;
return pool_id2repo($self, id);
}

%newobject repos;
Pool_repo_iterator * const repos;
%{
Expand Down Expand Up @@ -1498,15 +1499,6 @@ rb_eval_string(
void internalize() {
repo_internalize($self);
}
const char *lookup_str(Id entry, Id keyname) {
return repo_lookup_str($self, entry, keyname);
}
Id lookup_id(Id entry, Id keyname) {
return repo_lookup_id($self, entry, keyname);
}
unsigned long long lookup_num(Id entry, Id keyname, unsigned long long notfound = 0) {
return repo_lookup_num($self, entry, keyname, notfound);
}
bool write(FILE *fp) {
return repo_write($self, fp) == 0;
}
Expand All @@ -1531,12 +1523,24 @@ rb_eval_string(
return repo->repoid;
}
%}
%newobject solvables;
Repo_solvable_iterator * const solvables;
%{
SWIGINTERN Repo_solvable_iterator * Repo_solvables_get(Repo *repo) {
return new_Repo_solvable_iterator(repo);
}
%}
%newobject meta;
Datapos * const meta;
%{
SWIGINTERN Datapos * Repo_meta_get(Repo *repo) {
Datapos *pos = solv_calloc(1, sizeof(*pos));
pos->solvid = SOLVID_META;
pos->repo = repo;
return pos;
}
%}

%newobject solvables_iter;
Repo_solvable_iterator *solvables_iter() {
return new_Repo_solvable_iterator($self);
Expand Down Expand Up @@ -1709,6 +1713,24 @@ rb_eval_string(
pool->pos = oldpos;
return r;
}
unsigned long long lookup_num(Id keyname, unsigned long long notfound = 0) {
Pool *pool = $self->repo->pool;
Datapos oldpos = pool->pos;
unsigned long long r;
pool->pos = *$self;
r = pool_lookup_num(pool, SOLVID_POS, keyname, notfound);
pool->pos = oldpos;
return r;
}
bool lookup_void(Id keyname) {
Pool *pool = $self->repo->pool;
Datapos oldpos = pool->pos;
int r;
pool->pos = *$self;
r = pool_lookup_void(pool, SOLVID_POS, keyname);
pool->pos = oldpos;
return r;
}
%newobject lookup_checksum;
Chksum *lookup_checksum(Id keyname) {
Pool *pool = $self->repo->pool;
Expand Down
10 changes: 5 additions & 5 deletions examples/p5solv
Expand Up @@ -387,8 +387,8 @@ sub load_ext {
return 1;
}
print "fetching]\n";
my $defvendorid = $self->{'handle'}->lookup_id($solv::SOLVID_META, $solv::SUSETAGS_DEFAULTVENDOR);
my $descrdir = $self->{'handle'}->lookup_str($solv::SOLVID_META, $solv::SUSETAGS_DESCRDIR) || 'suse/setup/descr';
my $defvendorid = $self->{'handle'}->{'meta'}->lookup_id($solv::SUSETAGS_DEFAULTVENDOR);
my $descrdir = $self->{'handle'}->{'meta'}->lookup_str($solv::SUSETAGS_DESCRDIR) || 'suse/setup/descr';
my $filechksum = $repodata->lookup_checksum($solv::SOLVID_META, $solv::SUSETAGS_FILE_CHECKSUM);
my $f = $self->download("$descrdir/$filename", 1, $filechksum);
return 0 unless $f;
Expand Down Expand Up @@ -418,8 +418,8 @@ sub load {
}
$self->{'handle'}->add_content($f, 0);
print "fetching\n";
my $defvendorid = $self->{'handle'}->lookup_id($solv::SOLVID_META, $solv::SUSETAGS_DEFAULTVENDOR);
my $descrdir = $self->{'handle'}->lookup_str($solv::SOLVID_META, $solv::SUSETAGS_DESCRDIR) || 'suse/setup/descr';
my $defvendorid = $self->{'handle'}->{'meta'}->lookup_id($solv::SUSETAGS_DEFAULTVENDOR);
my $descrdir = $self->{'handle'}->{'meta'}->lookup_str($solv::SUSETAGS_DESCRDIR) || 'suse/setup/descr';
my ($filename, $filechksum) = $self->find('packages.gz');
($filename, $filechksum) = $self->find('packages') unless $filename;
if ($filename) {
Expand All @@ -445,7 +445,7 @@ sub load {

sub packagespath {
my ($self) = @_;
return ($self->{'handle'}->lookup_str($solv::SOLVID_META, $solv::SUSETAGS_DATADIR) || 'suse') . '/';
return ($self->{'handle'}->{'meta'}->lookup_str($solv::SUSETAGS_DATADIR) || 'suse') . '/';
}

package Repo::unknown;
Expand Down
10 changes: 5 additions & 5 deletions examples/pysolv
Expand Up @@ -418,8 +418,8 @@ class repo_susetags(repo_generic):
return True
self.handle.add_content(f, 0)
print "fetching"
defvendorid = self.handle.lookup_id(solv.SOLVID_META, solv.SUSETAGS_DEFAULTVENDOR)
descrdir = self.handle.lookup_str(solv.SOLVID_META, solv.SUSETAGS_DESCRDIR)
defvendorid = self.handle.meta.lookup_id(solv.SUSETAGS_DEFAULTVENDOR)
descrdir = self.handle.meta.lookup_str(solv.SUSETAGS_DESCRDIR)
if not descrdir:
descrdir = "suse/setup/descr"
(filename, filechksum) = self.find('packages.gz')
Expand Down Expand Up @@ -510,8 +510,8 @@ class repo_susetags(repo_generic):
return True
sys.stdout.write("fetching]\n")
sys.stdout.flush()
defvendorid = self.handle.lookup_id(solv.SOLVID_META, solv.SUSETAGS_DEFAULTVENDOR)
descrdir = self.handle.lookup_str(solv.SOLVID_META, solv.SUSETAGS_DESCRDIR)
defvendorid = self.handle.meta.lookup_id(solv.SUSETAGS_DEFAULTVENDOR)
descrdir = self.handle.meta.lookup_str(solv.SUSETAGS_DESCRDIR)
if not descrdir:
descrdir = "suse/setup/descr"
filechksum = repodata.lookup_checksum(solv.SOLVID_META, solv.SUSETAGS_FILE_CHECKSUM)
Expand All @@ -526,7 +526,7 @@ class repo_susetags(repo_generic):
return True

def packagespath(self):
datadir = repo.handle.lookup_str(solv.SOLVID_META, solv.SUSETAGS_DATADIR)
datadir = repo.handle.meta.lookup_str(solv.SUSETAGS_DATADIR)
if not datadir:
datadir = 'suse'
return datadir + '/'
Expand Down
10 changes: 5 additions & 5 deletions examples/rbsolv
Expand Up @@ -366,8 +366,8 @@ class Repo_susetags < Repo_generic
@handle.add_content(f, 0)
f.close
puts "fetching"
defvendorid = @handle.lookup_id(Solv::SOLVID_META, Solv::SUSETAGS_DEFAULTVENDOR)
descrdir = @handle.lookup_str(Solv::SOLVID_META, Solv::SUSETAGS_DESCRDIR)
defvendorid = @handle.meta.lookup_id(Solv::SUSETAGS_DEFAULTVENDOR)
descrdir = @handle.meta.lookup_str(Solv::SUSETAGS_DESCRDIR)
descrdir = "suse/setup/descr" unless descrdir
(filename, filechksum) = find('packages.gz')
(filename, filechksum) = find('packages') unless filename
Expand Down Expand Up @@ -449,8 +449,8 @@ class Repo_susetags < Repo_generic
return true
end
puts "fetching]\n"
defvendorid = @handle.lookup_id(Solv::SOLVID_META, Solv::SUSETAGS_DEFAULTVENDOR)
descrdir = @handle.lookup_str(Solv::SOLVID_META, Solv::SUSETAGS_DESCRDIR)
defvendorid = @handle.meta.lookup_id(Solv::SUSETAGS_DEFAULTVENDOR)
descrdir = @handle.meta.lookup_str(Solv::SUSETAGS_DESCRDIR)
descrdir = "suse/setup/descr" unless descrdir
filechksum = repodata.lookup_checksum(Solv::SOLVID_META, Solv::SUSETAGS_FILE_CHECKSUM)
f = download("#{descrdir}/#{filename}", true, filechksum)
Expand All @@ -464,7 +464,7 @@ class Repo_susetags < Repo_generic
end

def packagespath()
datadir = @handle.lookup_str(Solv::SOLVID_META, Solv::SUSETAGS_DATADIR)
datadir = @handle.meta.lookup_str(Solv::SUSETAGS_DATADIR)
datadir = "suse" unless datadir
return datadir + '/'
end
Expand Down
24 changes: 6 additions & 18 deletions src/pool.c
Expand Up @@ -2081,7 +2081,7 @@ const char *
pool_lookup_str(Pool *pool, Id entry, Id keyname)
{
if (entry == SOLVID_POS && pool->pos.repo)
return repodata_lookup_str(pool->pos.repo->repodata + pool->pos.repodataid, SOLVID_POS, keyname);
return repo_lookup_str(pool->pos.repo, pool->pos.repodataid ? entry : pool->pos.solvid, keyname);
if (entry <= 0)
return 0;
return solvable_lookup_str(pool->solvables + entry, keyname);
Expand All @@ -2091,11 +2091,7 @@ Id
pool_lookup_id(Pool *pool, Id entry, Id keyname)
{
if (entry == SOLVID_POS && pool->pos.repo)
{
Repodata *data = pool->pos.repo->repodata + pool->pos.repodataid;
Id id = repodata_lookup_id(data, SOLVID_POS, keyname);
return data->localpool ? repodata_globalize_id(data, id, 1) : id;
}
return repo_lookup_id(pool->pos.repo, pool->pos.repodataid ? entry : pool->pos.solvid, keyname);
if (entry <= 0)
return 0;
return solvable_lookup_id(pool->solvables + entry, keyname);
Expand All @@ -2105,12 +2101,7 @@ unsigned long long
pool_lookup_num(Pool *pool, Id entry, Id keyname, unsigned long long notfound)
{
if (entry == SOLVID_POS && pool->pos.repo)
{
unsigned long long value;
if (repodata_lookup_num(pool->pos.repo->repodata + pool->pos.repodataid, SOLVID_POS, keyname, &value))
return value;
return notfound;
}
return repo_lookup_num(pool->pos.repo, pool->pos.repodataid ? entry : pool->pos.solvid, keyname, notfound);
if (entry <= 0)
return notfound;
return solvable_lookup_num(pool->solvables + entry, keyname, notfound);
Expand All @@ -2120,7 +2111,7 @@ int
pool_lookup_void(Pool *pool, Id entry, Id keyname)
{
if (entry == SOLVID_POS && pool->pos.repo)
return repodata_lookup_void(pool->pos.repo->repodata + pool->pos.repodataid, SOLVID_POS, keyname);
return repo_lookup_void(pool->pos.repo, pool->pos.repodataid ? entry : pool->pos.solvid, keyname);
if (entry <= 0)
return 0;
return solvable_lookup_void(pool->solvables + entry, keyname);
Expand All @@ -2130,7 +2121,7 @@ const unsigned char *
pool_lookup_bin_checksum(Pool *pool, Id entry, Id keyname, Id *typep)
{
if (entry == SOLVID_POS && pool->pos.repo)
return repodata_lookup_bin_checksum(pool->pos.repo->repodata + pool->pos.repodataid, SOLVID_POS, keyname, typep);
return repo_lookup_bin_checksum(pool->pos.repo, pool->pos.repodataid ? entry : pool->pos.solvid, keyname, typep);
if (entry <= 0)
return 0;
return solvable_lookup_bin_checksum(pool->solvables + entry, keyname, typep);
Expand All @@ -2140,10 +2131,7 @@ const char *
pool_lookup_checksum(Pool *pool, Id entry, Id keyname, Id *typep)
{
if (entry == SOLVID_POS && pool->pos.repo)
{
const unsigned char *chk = repodata_lookup_bin_checksum(pool->pos.repo->repodata + pool->pos.repodataid, SOLVID_POS, keyname, typep);
return chk ? repodata_chk2str(pool->pos.repo->repodata + pool->pos.repodataid, *typep, chk) : 0;
}
return repo_lookup_checksum(pool->pos.repo, pool->pos.repodataid ? entry : pool->pos.solvid, keyname, typep);
if (entry <= 0)
return 0;
return solvable_lookup_checksum(pool->solvables + entry, keyname, typep);
Expand Down
21 changes: 21 additions & 0 deletions src/repo.c
Expand Up @@ -1140,6 +1140,8 @@ repo_lookup_str(Repo *repo, Id entry, Id keyname)
return pool_id2str(pool, pool->solvables[entry].vendor);
}
}
else if (entry == SOLVID_POS && pool->pos.repo == repo && pool->pos.repodataid)
return repodata_lookup_str(pool->pos.repo->repodata + pool->pos.repodataid, entry, keyname);
FOR_REPODATAS(repo, i, data)
{
if (entry != SOLVID_META && (entry < data->start || entry >= data->end))
Expand All @@ -1159,6 +1161,7 @@ repo_lookup_str(Repo *repo, Id entry, Id keyname)
unsigned long long
repo_lookup_num(Repo *repo, Id entry, Id keyname, unsigned long long notfound)
{
Pool *pool = repo->pool;
Repodata *data;
int i;
unsigned long long value;
Expand All @@ -1172,6 +1175,8 @@ repo_lookup_num(Repo *repo, Id entry, Id keyname, unsigned long long notfound)
return notfound;
}
}
else if (entry == SOLVID_POS && pool->pos.repo == repo && pool->pos.repodataid)
return repodata_lookup_num(pool->pos.repo->repodata + pool->pos.repodataid, entry, keyname, &value) ? value : notfound;
FOR_REPODATAS(repo, i, data)
{
if (entry != SOLVID_META && (entry < data->start || entry >= data->end))
Expand All @@ -1189,6 +1194,7 @@ repo_lookup_num(Repo *repo, Id entry, Id keyname, unsigned long long notfound)
Id
repo_lookup_id(Repo *repo, Id entry, Id keyname)
{
Pool *pool = repo->pool;
Repodata *data;
int i;
Id id;
Expand All @@ -1207,6 +1213,12 @@ repo_lookup_id(Repo *repo, Id entry, Id keyname)
return repo->pool->solvables[entry].vendor;
}
}
else if (entry == SOLVID_POS && pool->pos.repo == repo && pool->pos.repodataid)
{
Repodata *data = pool->pos.repo->repodata + pool->pos.repodataid;
Id id = repodata_lookup_id(data, entry, keyname);
return data->localpool ? repodata_globalize_id(data, id, 1) : id;
}
FOR_REPODATAS(repo, i, data)
{
if (entry != SOLVID_META && (entry < data->start || entry >= data->end))
Expand Down Expand Up @@ -1317,10 +1329,13 @@ repo_lookup_deparray(Repo *repo, Id entry, Id keyname, Queue *q, Id marker)
const unsigned char *
repo_lookup_bin_checksum(Repo *repo, Id entry, Id keyname, Id *typep)
{
Pool *pool = repo->pool;
Repodata *data;
int i;
const unsigned char *chk;

if (entry == SOLVID_POS && pool->pos.repo == repo && pool->pos.repodataid)
return repodata_lookup_bin_checksum(pool->pos.repo->repodata + pool->pos.repodataid, entry, keyname, typep);
FOR_REPODATAS(repo, i, data)
{
if (entry != SOLVID_META && (entry < data->start || entry >= data->end))
Expand All @@ -1347,10 +1362,13 @@ repo_lookup_checksum(Repo *repo, Id entry, Id keyname, Id *typep)
int
repo_lookup_void(Repo *repo, Id entry, Id keyname)
{
Pool *pool = repo->pool;
Repodata *data;
int i;
Id type;

if (entry == SOLVID_POS && pool->pos.repo == repo && pool->pos.repodataid)
return repodata_lookup_void(pool->pos.repo->repodata + pool->pos.repodataid, entry, keyname);
FOR_REPODATAS(repo, i, data)
{
if (entry != SOLVID_META && (entry < data->start || entry >= data->end))
Expand All @@ -1367,10 +1385,13 @@ repo_lookup_void(Repo *repo, Id entry, Id keyname)
Id
repo_lookup_type(Repo *repo, Id entry, Id keyname)
{
Pool *pool = repo->pool;
Repodata *data;
int i;
Id type;

if (entry == SOLVID_POS && pool->pos.repo == repo && pool->pos.repodataid)
return repodata_lookup_type(pool->pos.repo->repodata + pool->pos.repodataid, entry, keyname);
FOR_REPODATAS(repo, i, data)
{
if (entry != SOLVID_META && (entry < data->start || entry >= data->end))
Expand Down

0 comments on commit 0424ef2

Please sign in to comment.