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.
ngcp-panel/lib/NGCP/Panel/Utils/DeviceFirmware.pm

77 lines
1.6 KiB

package NGCP::Panel::Utils::DeviceFirmware;
use warnings;
use strict;
use English;
sub insert_firmware_data {
my (%args) = @_;
my $c = $args{c};
my $fw_id = $args{fw_id};
# either data_ref or data_fh are expected
my $data_ref = $args{data_ref};
my $data_fh = $args{data_fh};
# do not set it larger than 10M
my $chunk_size = 10*1024*1024; # 10MB
$c->model('DB')->resultset('autoprov_firmwares')->find({id => $fw_id},{for => 'update'});
my $rs = $c->model('DB')->resultset('autoprov_firmwares_data')->search({
fw_id => $fw_id
});
if ($rs->count > 0) {
$rs->delete;
}
my $fh;
if ($data_fh) {
$fh = $data_fh;
seek($fh, 0, 0);
} else {
open($fh, "<:raw", $data_ref)
or die "Cannot open firmware_data filehandler: ".$ERRNO;
}
my $buffer;
my $offset = 0;
binmode $fh;
while (read($fh, $buffer, $chunk_size, 0)) {
$c->model('DB')->resultset('autoprov_firmwares_data')->create(
{ fw_id => $fw_id, data => $buffer }
);
$offset += $chunk_size;
seek($fh, $offset, 0);
}
close $fh;
return;
}
sub get_firmware_data {
my (%args) = @_;
my $c = $args{c};
my $fw_id = $args{fw_id};
my $rs = $c->model('DB')->resultset('autoprov_firmwares_data')->search({
fw_id => $fw_id
},
{
order_by => { -asc => 'id' }
});
my $data = '';
if ($rs->first) {
foreach my $fw_data ($rs->all) {
$data = $data . $fw_data->data;
}
}
return $data;
}
1;
# vim: set tabstop=4 expandtab: