diff --git a/lib/NGCP/Schema/Result/contracts.pm b/lib/NGCP/Schema/Result/contracts.pm index ec8dae17..e29f82f0 100644 --- a/lib/NGCP/Schema/Result/contracts.pm +++ b/lib/NGCP/Schema/Result/contracts.pm @@ -253,6 +253,13 @@ __PACKAGE__->has_many( { cascade_copy => 0, cascade_delete => 0 }, ); +__PACKAGE__->has_many( + "voip_contract_locations", + "NGCP::Schema::Result::voip_contract_locations", + { "foreign.contract_id" => "self.id" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + __PACKAGE__->belongs_to( "profile_package", "NGCP::Schema::Result::profile_packages", diff --git a/lib/NGCP/Schema/Result/voip_contract_location_blocks.pm b/lib/NGCP/Schema/Result/voip_contract_location_blocks.pm new file mode 100644 index 00000000..ef223bc6 --- /dev/null +++ b/lib/NGCP/Schema/Result/voip_contract_location_blocks.pm @@ -0,0 +1,181 @@ +package NGCP::Schema::Result::voip_contract_location_blocks; +use Scalar::Util qw(blessed); +use Math::BigInt; +use parent 'DBIx::Class::Core'; + +our $VERSION = '2.007'; + +__PACKAGE__->load_components("InflateColumn::DateTime", "Helper::Row::ToJSON"); + +__PACKAGE__->table("provisioning.voip_contract_location_blocks"); + +__PACKAGE__->add_columns( + "id", + { data_type => "integer", is_auto_increment => 1, is_nullable => 0 }, + "location_id", + { + data_type => "integer", + extra => { unsigned => 1 }, + is_foreign_key => 1, + is_nullable => 0, + }, + "ip", + { data_type => "varchar", is_nullable => 0, size => 39 }, + "mask", + { data_type => "tinyint", extra => { unsigned => 1 }, is_nullable => 1 }, + "_ipv4_net_from", + { data_type => "varbinary", is_nullable => 1, size => 4 }, + "_ipv4_net_to", + { data_type => "varbinary", is_nullable => 1, size => 4 }, + "_ipv6_net_from", + { data_type => "varbinary", is_nullable => 1, size => 16 }, + "_ipv6_net_to", + { data_type => "varbinary", is_nullable => 1, size => 16 }, + +); + +__PACKAGE__->set_primary_key("id"); + +__PACKAGE__->belongs_to( + "voip_contract_location", + "NGCP::Schema::Result::voip_contract_locations", + { "foreign.id" => "self.location_id" }, + { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" }, +); + + __PACKAGE__->inflate_column('_ipv4_net_from', { + inflate => sub { + my ($data) = @_; + _bytes_to_bigint($data,4); + }, + deflate => sub { + my ($bigint) = @_; + _bigint_to_bytes($bigint,4); + }, + }); + __PACKAGE__->inflate_column('_ipv4_net_to', { + inflate => sub { + my ($data) = @_; + _bytes_to_bigint($data,4); + }, + deflate => sub { + my ($bigint) = @_; + _bigint_to_bytes($bigint,4); + }, + }); + __PACKAGE__->inflate_column('_ipv6_net_from', { + inflate => sub { + my ($data) = @_; + _bytes_to_bigint($data,16); + }, + deflate => sub { + my ($bigint) = @_; + _bigint_to_bytes($bigint,16); + }, + }); + __PACKAGE__->inflate_column('_ipv6_net_to', { + inflate => sub { + my ($data) = @_; + _bytes_to_bigint($data,16); + }, + deflate => sub { + my ($bigint) = @_; + _bigint_to_bytes($bigint,16); + }, + }); + +sub TO_JSON { + my ($self) = @_; + return { + map { if (blessed($_)) { + if ($_->isa('DateTime')) { + $_->datetime; + } elsif ($_->isa('Math::BigInt')) { + $_->as_hex(); + } else { + $_; + } + } else { + $_; + } + } %{ $self->next::method } + }; +} + +sub _bigint_to_bytes { + my ($bigint,$size) = @_; + return undef if !defined $bigint; + #print '>'.sprintf('%0' . 2 * $size . 's',substr($bigint->as_hex(),2)) . "\n"; + return pack('C' x $size, map { hex($_) } (sprintf('%0' . 2 * $size . 's',substr($bigint->as_hex(),2)) =~ /(..)/g)); + #print '>' . join('',map { sprintf('%02x',$_) } unpack('C' x $size, $data)) . "\n"; + #return $data; +} + +sub _bytes_to_bigint { + my ($data,$size) = @_; + return undef if !defined $data; + return Math::BigInt->new('0x' . join('',map { sprintf('%02x',$_) } unpack('C' x $size, $data))) +} + +1; +__END__ + +=encoding UTF-8 + +=head1 NAME + +NGCP::Schema::Result::voip_contract_location_blocks + +=head1 COMPONENTS LOADED + +=over 4 + +=item * L + +=item * L + +=back + +=head1 TABLE: C + +=head1 ACCESSORS + +=head2 id + + data_type: 'integer' + is_auto_increment: 1 + is_nullable: 0 + +=head2 location_id + + data_type: 'integer' + extra: {unsigned => 1} + is_foreign_key: 1 + is_nullable: 0 + +=head2 ip + + data_type: 'varchar' + is_nullable: 0 + size: 39 + +=head2 mask + + data_type: 'tinyint' + is_nullable: 0 + +=head1 PRIMARY KEY + +=over 4 + +=item * L + +=back + +=head1 RELATIONS + +=head2 voip_contract_location + +Type: belongs_to + +Related object: L diff --git a/lib/NGCP/Schema/Result/voip_contract_locations.pm b/lib/NGCP/Schema/Result/voip_contract_locations.pm new file mode 100644 index 00000000..a4d32b69 --- /dev/null +++ b/lib/NGCP/Schema/Result/voip_contract_locations.pm @@ -0,0 +1,114 @@ +package NGCP::Schema::Result::voip_contract_locations; +use Scalar::Util qw(blessed); +use parent 'DBIx::Class::Core'; + +our $VERSION = '2.007'; + +__PACKAGE__->load_components("InflateColumn::DateTime", "Helper::Row::ToJSON"); + +__PACKAGE__->table("provisioning.voip_contract_locations"); + +__PACKAGE__->add_columns( + "id", + { data_type => "integer", is_auto_increment => 1, is_nullable => 0 }, + "contract_id", + { + data_type => "integer", + extra => { unsigned => 1 }, + is_foreign_key => 1, + is_nullable => 0, + }, + "name", + { data_type => "varchar", is_nullable => 0, size => 255 }, + "description", + { data_type => "varchar", is_nullable => 0, size => 255 }, +); + +__PACKAGE__->set_primary_key("id"); + +__PACKAGE__->add_unique_constraint("vcl_contract_name_idx", ["contract_id", "name"]); + +__PACKAGE__->has_many( + "voip_contract_location_blocks", + "NGCP::Schema::Result::voip_contract_location_blocks", + { "foreign.location_id" => "self.id" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + +__PACKAGE__->belongs_to( + "contract", + "NGCP::Schema::Result::contracts", + { "foreign.id" => "self.contract_id" }, + { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" }, +); + +sub TO_JSON { + my ($self) = @_; + return { + map { blessed($_) && $_->isa('DateTime') ? $_->datetime : $_ } %{ $self->next::method } + }; +} + +1; +__END__ + +=encoding UTF-8 + +=head1 NAME + +NGCP::Schema::Result::voip_contract_locations + +=head1 COMPONENTS LOADED + +=over 4 + +=item * L + +=item * L + +=back + +=head1 TABLE: C + +=head1 ACCESSORS + +=head2 id + + data_type: 'integer' + is_auto_increment: 1 + is_nullable: 0 + +=head2 contract_id + + data_type: 'integer' + extra: {unsigned => 1} + is_nullable: 0 + +=head2 name + + data_type: 'varchar' + is_nullable: 0 + size: 255 + +=head2 description + + data_type: 'varchar' + is_nullable: 0 + size: 255 + +=head1 PRIMARY KEY + +=over 4 + +=item * L + +=back + +=head1 RELATIONS + +=head2 voip_contract_location_blocks + +Type: has_many + +Related object: L + diff --git a/lib/NGCP/Schema/Result/voip_contract_preferences.pm b/lib/NGCP/Schema/Result/voip_contract_preferences.pm index 43bb5c97..1fa78548 100644 --- a/lib/NGCP/Schema/Result/voip_contract_preferences.pm +++ b/lib/NGCP/Schema/Result/voip_contract_preferences.pm @@ -23,6 +23,13 @@ __PACKAGE__->add_columns( is_foreign_key => 1, is_nullable => 0, }, + "location_id", + { + data_type => "integer", + extra => { unsigned => 1 }, + is_foreign_key => 1, + is_nullable => 1, + }, "attribute_id", { data_type => "integer",