X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Debbugs%2FDB%2FResult%2FBinVer.pm;h=9eb144b4d1795ed1abcb098738c5b13700acad4a;hb=37356e95886969d5a5a5609f3e2fc95226e05cc5;hp=688b7fe0713f9f977f26c0ecbbdf93bd584b7da0;hpb=35bce53278e15f926931264b88abf2e28b040d3b;p=debbugs.git diff --git a/Debbugs/DB/Result/BinVer.pm b/Debbugs/DB/Result/BinVer.pm index 688b7fe..9eb144b 100644 --- a/Debbugs/DB/Result/BinVer.pm +++ b/Debbugs/DB/Result/BinVer.pm @@ -21,11 +21,13 @@ use base 'DBIx::Class::Core'; =item * L +=item * L + =back =cut -__PACKAGE__->load_components("InflateColumn::DateTime"); +__PACKAGE__->load_components("InflateColumn::DateTime", "TimeStamp"); =head1 TABLE: C @@ -52,7 +54,7 @@ Binary version id Binary package id (matches bin_pkg) -=head2 src_ver_id +=head2 src_ver data_type: 'integer' is_foreign_key: 1 @@ -60,7 +62,7 @@ Binary package id (matches bin_pkg) Source version (matchines src_ver) -=head2 arch_id +=head2 arch data_type: 'integer' is_foreign_key: 1 @@ -87,9 +89,9 @@ __PACKAGE__->add_columns( }, "bin_pkg", { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, - "src_ver_id", + "src_ver", { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, - "arch_id", + "arch", { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, "ver", { data_type => "debversion", is_nullable => 0 }, @@ -115,7 +117,7 @@ __PACKAGE__->set_primary_key("id"); =item * L -=item * L +=item * L =item * L @@ -123,21 +125,7 @@ __PACKAGE__->set_primary_key("id"); =cut -__PACKAGE__->add_unique_constraint("bin_ver_bin_pkg_id_arch_idx", ["bin_pkg", "arch_id", "ver"]); - -=head2 C - -=over 4 - -=item * L - -=item * L - -=back - -=cut - -__PACKAGE__->add_unique_constraint("bin_ver_src_ver_id_arch_idx", ["src_ver_id", "arch_id"]); +__PACKAGE__->add_unique_constraint("bin_ver_bin_pkg_id_arch_idx", ["bin_pkg", "arch", "ver"]); =head1 RELATIONS @@ -152,8 +140,8 @@ Related object: L __PACKAGE__->belongs_to( "arch", "Debbugs::DB::Result::Arch", - { id => "arch_id" }, - { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" }, + { id => "arch" }, + { is_deferrable => 0, on_delete => "CASCADE", on_update => "CASCADE" }, ); =head2 bin_associations @@ -183,7 +171,7 @@ __PACKAGE__->belongs_to( "bin_pkg", "Debbugs::DB::Result::BinPkg", { id => "bin_pkg" }, - { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" }, + { is_deferrable => 0, on_delete => "CASCADE", on_update => "CASCADE" }, ); =head2 src_ver @@ -197,14 +185,80 @@ Related object: L __PACKAGE__->belongs_to( "src_ver", "Debbugs::DB::Result::SrcVer", - { id => "src_ver_id" }, - { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" }, + { id => "src_ver" }, + { is_deferrable => 0, on_delete => "CASCADE", on_update => "CASCADE" }, ); -# Created by DBIx::Class::Schema::Loader v0.07025 @ 2013-03-27 18:54:20 -# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:3K+5M1Rohq6AB4uLnVco+w - +# Created by DBIx::Class::Schema::Loader v0.07045 @ 2016-11-24 09:08:27 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:DzTzZbPkilT8WMhXoZv9xw + + +sub sqlt_deploy_hook { + my ($self, $sqlt_table) = @_; + for my $idx (qw(ver bin_pkg src_ver)) { + $sqlt_table->add_index(name => 'bin_ver_'.$idx.'_id_idx', + fields => [$idx]); + } + $sqlt_table->add_index(name => 'bin_ver_src_ver_id_arch_idx', + fields => [qw(src_ver arch)] + ); + $sqlt_table->schema-> + add_procedure(name => 'bin_ver_to_src_pkg', + sql => <<'EOF', +CREATE OR REPLACE FUNCTION bin_ver_to_src_pkg(bin_ver INT) RETURNS INT + AS $src_pkg_from_bin_ver$ + DECLARE + src_pkg int; + BEGIN + SELECT sv.src_pkg INTO STRICT src_pkg + FROM bin_ver bv JOIN src_ver sv ON bv.src_ver=sv.id + WHERE bv.id=bin_ver; + RETURN src_pkg; + END + $src_pkg_from_bin_ver$ LANGUAGE plpgsql; +EOF + ); + $sqlt_table->schema-> + add_procedure(name => 'update_bin_pkg_src_pkg_bin_ver', + sql => <<'EOF', +CREATE OR REPLACE FUNCTION update_bin_pkg_src_pkg_bin_ver () RETURNS TRIGGER + AS $update_bin_pkg_src_pkg_bin_ver$ + DECLARE + src_ver_rows integer; + BEGIN + IF (TG_OP = 'DELETE' OR TG_OP = 'UPDATE' ) THEN + -- if there is still a bin_ver with this src_pkg, then do nothing + PERFORM * FROM bin_ver bv JOIN src_ver sv ON bv.src_ver = sv.id + WHERE sv.id = OLD.src_ver LIMIT 2; + GET DIAGNOSTICS src_ver_rows = ROW_COUNT; + IF (src_ver_rows <= 1) THEN + DELETE FROM bin_pkg_src_pkg + WHERE bin_pkg=OLD.bin_pkg AND + src_pkg=src_ver_to_src_pkg(OLD.src_ver); + END IF; + END IF; + IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN + BEGIN + INSERT INTO bin_pkg_src_pkg (bin_pkg,src_pkg) + VALUES (NEW.bin_pkg,src_ver_to_src_pkg(NEW.src_ver)) + ON CONFLICT (bin_pkg,src_pkg) DO NOTHING; + END; + END IF; + RETURN NULL; + END + $update_bin_pkg_src_pkg_bin_ver$ LANGUAGE plpgsql; +EOF + ); +# $sqlt_table->schema-> +# add_trigger(name => 'bin_ver_update_bin_pkg_src_pkg', +# perform_action_when => 'after', +# database_events => [qw(INSERT UPDATE DELETE)], +# on_table => 'bin_ver', +# action => <<'EOF', +# FOR EACH ROW EXECUTE PROCEDURE update_bin_pkg_src_pkg_bin_ver(); +# EOF +# ); +} -# You can replace this text with custom code or comments, and it will be preserved on regeneration 1;