You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.6 KiB
101 lines
2.6 KiB
package NGCP::Schema::Result::messages_custom;
|
|
use Scalar::Util qw(blessed);
|
|
use parent qw/DBIx::Class::Core/;
|
|
|
|
our $VERSION = '2.007';
|
|
|
|
__PACKAGE__->load_components(
|
|
"InflateColumn::DateTime",
|
|
"Helper::Row::ToJSON",
|
|
"+NGCP::Schema::InflateColumn::DateTime::EpochMicro",
|
|
);
|
|
__PACKAGE__->table_class('DBIx::Class::ResultSource::View');
|
|
|
|
__PACKAGE__->table("messages_custom");
|
|
|
|
|
|
__PACKAGE__->add_columns(
|
|
"id",
|
|
{
|
|
data_type => "bigint",
|
|
extra => { unsigned => 1 },
|
|
is_auto_increment => 1,
|
|
is_nullable => 0,
|
|
},
|
|
"timestamp",
|
|
{ data_type => "decimal", is_nullable => 0, size => [17, 6], inflate_datetime => 'epoch_micro' },
|
|
"min_timestamp",
|
|
{ data_type => "decimal", is_nullable => 0, size => [17, 6], inflate_datetime => 'epoch_micro' },
|
|
"protocol",
|
|
{
|
|
data_type => "enum",
|
|
extra => { list => ["IPv4", "IPv6"] },
|
|
is_nullable => 0,
|
|
},
|
|
"transport",
|
|
{
|
|
data_type => "enum",
|
|
extra => { list => ["UDP", "TCP"] },
|
|
is_nullable => 0,
|
|
},
|
|
"src_ip",
|
|
{ data_type => "varchar", is_nullable => 0, size => 39 },
|
|
"dst_ip",
|
|
{ data_type => "varchar", is_nullable => 0, size => 39 },
|
|
"src_port",
|
|
{ data_type => "smallint", extra => { unsigned => 1 }, is_nullable => 0 },
|
|
"dst_port",
|
|
{ data_type => "smallint", extra => { unsigned => 1 }, is_nullable => 0 },
|
|
"payload",
|
|
{ data_type => "blob", is_nullable => 0 },
|
|
"method",
|
|
{
|
|
accessor => "column_method",
|
|
data_type => "varchar",
|
|
is_nullable => 0,
|
|
size => 20,
|
|
},
|
|
"cseq_method",
|
|
{ data_type => "varchar", is_nullable => 0, size => 16 },
|
|
"call_id",
|
|
{ data_type => "varchar", is_nullable => 0, size => 255 },
|
|
"request_uri",
|
|
{ data_type => "varchar", is_nullable => 0, size => 255 },
|
|
"from_uri",
|
|
{ data_type => "varchar", is_nullable => 0, size => 255 },
|
|
"caller_uuid",
|
|
{ data_type => "varchar", is_nullable => 0, size => 255 },
|
|
"callee_uuid",
|
|
{ data_type => "varchar", is_nullable => 0, size => 255 },
|
|
);
|
|
|
|
__PACKAGE__->set_primary_key("id");
|
|
|
|
sub TO_JSON {
|
|
my ($self) = @_;
|
|
return {
|
|
map { blessed($_) && $_->isa('DateTime') ? $_->datetime : $_ } %{ $self->next::method }
|
|
};
|
|
}
|
|
|
|
__PACKAGE__->result_source_instance->is_virtual(1);
|
|
|
|
__PACKAGE__->result_source_instance->view_definition(<<SQL);
|
|
SELECT MIN(m.timestamp) AS min_timestamp, m.* FROM
|
|
(
|
|
(
|
|
SELECT DISTINCT ( call_id )
|
|
FROM sipstats.messages
|
|
WHERE caller_uuid LIKE ? COLLATE utf8_bin
|
|
OR callee_uuid LIKE ? COLLATE utf8_bin
|
|
OR call_id LIKE ? COLLATE utf8_bin
|
|
ORDER BY timestamp DESC
|
|
LIMIT ?, ?
|
|
)
|
|
) q JOIN sipstats.messages m ON q.call_id = m.call_id
|
|
GROUP BY call_id
|
|
SQL
|
|
|
|
1;
|
|
|