minor tweaks and addition:

- prepare to handle all columns in the main ports view.
- add a PathId column to a few views where it makes sense.
- reorg inserter to simplify all creation of tables and views thru a single
common method instead of rolling my own several times.
This commit is contained in:
espie 2018-11-25 15:04:10 +00:00
parent 8dfafdf6a5
commit b315aa16de
4 changed files with 48 additions and 37 deletions

View File

@ -1,7 +1,7 @@
# $OpenBSD: Makefile,v 1.81 2018/11/19 19:58:28 espie Exp $
# $OpenBSD: Makefile,v 1.82 2018/11/25 15:04:10 espie Exp $
CATEGORIES = databases
V = 6.16
V = 6.17
DISTNAME = sqlports-$V
DISTFILES =
COMMENT = sqlite database of ports

View File

@ -1,5 +1,5 @@
#! /usr/bin/perl
# $OpenBSD: Column.pm,v 1.9 2010/10/02 10:26:17 espie Exp $
# $OpenBSD: Column.pm,v 1.10 2018/11/25 15:04:10 espie Exp $
#
# Copyright (c) 2006-2010 Marc Espie <espie@openbsd.org>
#
@ -122,6 +122,12 @@ sub realname
return $self->table.".FULLPKGPATH";
}
sub view_schema
{
my ($self, $t) = @_;
return ($self->table."."."Id AS PathId", $self->SUPER::view_schema($t));
}
sub normal_schema
{
my ($self, $inserter, $class) = @_;

View File

@ -1,5 +1,5 @@
#! /usr/bin/perl
# $OpenBSD: Inserter.pm,v 1.17 2018/11/21 16:00:49 espie Exp $
# $OpenBSD: Inserter.pm,v 1.18 2018/11/25 15:04:10 espie Exp $
#
# Copyright (c) 2006-2010 Marc Espie <espie@openbsd.org>
#
@ -77,7 +77,8 @@ sub new
transaction => 0,
threshold => $i,
vars => {},
tables_created => {},
table_created => {},
view_created => {},
errors => [],
done => {},
todo => {},
@ -157,8 +158,6 @@ sub make_table
{
my ($self, $class, $constraint, @columns) = @_;
return if defined $self->{tables_created}{$class->table};
unshift(@columns, PathColumn->new);
for my $c (@columns) {
$c->set_vartype($class) unless defined $c->{vartype};
@ -184,16 +183,10 @@ sub make_ordered_view
unshift(@group, 'fullpkgpath');
my $groupby = join(', ', @group);
my $result = join(',', @group, 'group_concat(value, " ") as value');
return if defined $self->{view_created}{$view};
$self->{view_created}{$view} = 1;
my $v = qq{
CREATE VIEW $view as
$self->new_object('VIEW', $class->table."_ordered",
qq{as
with o as ($subselect)
select $result from o group by $groupby;};
print "$v\n" if $self->{verbose};
$self->db->do("DROP VIEW IF EXISTS $view");
$self->db->do($v);
select $result from o group by $groupby;});
}
sub set
@ -218,18 +211,32 @@ sub insert_done
$self->{transaction}++;
}
sub new_object
{
my ($self, $type, $name, $request) = @_;
my $o;
if ($type eq 'VIEW') {
return if defined $self->{view_created}{$name};
$self->{view_created}{$name} = 1;
$o = $self->view_name($name);
} elsif ($type eq 'TABLE') {
return if defined $self->{table_created}{$name};
$self->{table_created}{$name} = 1;
$o = $self->table_name($name);
} else {
die "unknown object type";
}
$self->db->do("DROP $type IF EXISTS $o");
$request = "CREATE $type $o $request";
print "$request\n" if $self->{verbose};
$self->db->do($request);
}
sub new_table
{
my ($self, $name, @cols) = @_;
my $t = $self->table_name($name);
return if defined $self->{tables_created}{$name};
$self->db->do("DROP TABLE IF EXISTS $t");
my $request = "CREATE TABLE $name (".join(', ', @cols).")";
print "$request\n" if $self->{verbose};
$self->db->do($request);
$self->{tables_created}{$name} = 1;
$self->new_object('TABLE', $name, "(".join(', ', @cols).")");
}
sub prepare
@ -383,23 +390,17 @@ sub create_view
my ($self, $table, @columns) = @_;
unshift(@columns, PathColumn->new);
my $view = $self->view_name($table);
return if defined $self->{view_created}{$view};
$self->{view_created}{$view} = 1;
my @l = $self->map_columns('view', $table, @columns);
my @j = $self->map_columns('join', $table, @columns);
my $v = "CREATE VIEW $view AS SELECT ".join(", ", @l). " FROM ".$self->table_name($table).' '.join(' ', @j);
print "$v\n" if $self->{verbose};
$self->db->do("DROP VIEW IF EXISTS $view");
$self->db->do($v);
$self->new_object('VIEW', $table,
"AS SELECT ".join(", ", @l). " FROM ".
$self->table_name($table).' '.join(' ', @j));
}
sub make_table
{
my ($self, $class, $constraint, @columns) = @_;
return if defined $self->{tables_created}{$class->table};
$self->SUPER::make_table($class, $constraint, @columns);
$self->create_view($class->table, @columns);
}
@ -417,9 +418,7 @@ sub create_path_table
sub handle_column
{
my ($self, $column) = @_;
# if there's an extra table, it doesn't end up in the default view
# (yet)
if (!defined($column->{vartype}->table)) {
if ($column->{vartype}->want_in_ports_view) {
$self->SUPER::handle_column($column);
}
}

View File

@ -1,4 +1,4 @@
# $OpenBSD: Var.pm,v 1.33 2018/11/19 19:58:28 espie Exp $
# $OpenBSD: Var.pm,v 1.34 2018/11/25 15:04:10 espie Exp $
#
# Copyright (c) 2006-2010 Marc Espie <espie@openbsd.org>
#
@ -131,6 +131,12 @@ sub group_by
return ();
}
sub want_in_ports_view
{
my $self = shift;
return !defined $self->table;
}
# for distinction later
package FullpkgnameVar;
our @ISA = qw(AnyVar);