App-DrivePlayer
view release on metacpan or search on metacpan
lib/App/DrivePlayer/GUI/MetadataFetch.pm view on Meta::CPAN
close $writer;
POSIX::_exit(0);
}
# ---- parent: reads results without blocking ----
close $writer;
$self->_meta_pid($pid);
$self->_meta_reader($reader);
$self->_meta_buf(q{});
my $updated = 0;
my $finish = sub {
if (my $wid = $self->_meta_watch_id) {
$self->_meta_watch_id(undef);
Glib::Source->remove($wid);
}
$self->_meta_pid(undef);
$self->_meta_fetch_item->set_label('Fetch All Metadata');
close $reader;
$self->_meta_reader(undef);
waitpid($pid, 0);
};
my $process_msg = sub {
my ($msg) = @_;
if ($msg->{status}) {
$self->_set_status(
"$msg->{status} $msg->{n}/$msg->{total} ($updated updated): $msg->{title}"
);
}
elsif ($msg->{result}) {
$updated += $self->_apply_meta_result($msg);
}
return;
};
my $watch_id = Glib::IO->add_watch(fileno($reader), ['in', 'hup'], sub {
my (undef, $cond) = @_;
my $chunk = q{};
my $bytes = sysread($reader, $chunk, 65536);
if (!defined $bytes || $bytes == 0) {
$finish->();
$self->_set_status("Metadata fetch done â $updated of $total updated.");
$self->_load_library();
$self->_auto_sync_to_sheet() if $updated;
return FALSE;
}
my $buf = $self->_meta_buf . $chunk;
while ($buf =~ s/\A([^\n]+)\n//) {
my $msg = eval { decode_json($1) } or next;
$process_msg->($msg);
}
$self->_meta_buf($buf);
t/unit/Test/DrivePlayer/DB.pm view on Meta::CPAN
is ref($sf), 'HASH', 'upsert_scan_folder returns hashref';
ok $sf->{id}, 'returned row has id';
is $sf->{drive_id}, FAKE_FOLDER_ID, 'drive_id correct';
is $sf->{name}, FAKE_FOLDER_NAME, 'name correct';
}
sub upsert_scan_folder_update : Tests(2) {
my ($self) = @_;
$self->db->upsert_scan_folder(FAKE_FOLDER_ID, 'Original Name');
my $updated = $self->db->upsert_scan_folder(FAKE_FOLDER_ID, 'Updated Name');
is $updated->{name}, 'Updated Name', 'name updated on conflict';
is $self->db->schema->resultset('ScanFolder')->count, 1, 'no duplicate row created';
}
sub get_scan_folder_by_drive_id : Tests(3) {
my ($self) = @_;
$self->db->upsert_scan_folder(FAKE_FOLDER_ID, FAKE_FOLDER_NAME);
my $sf = $self->db->get_scan_folder_by_drive_id(FAKE_FOLDER_ID);
is $sf->{drive_id}, FAKE_FOLDER_ID, 'found by drive_id';
is $sf->{name}, FAKE_FOLDER_NAME, 'name correct';
t/unit/Test/DrivePlayer/DB.pm view on Meta::CPAN
is $fld->{name}, 'Rock', 'name correct';
ok defined $fld->{path}, 'path present';
is $fld->{scan_folder_id}, $sf->{id}, 'scan_folder_id correct';
}
sub upsert_folder_update : Tests(2) {
my ($self) = @_;
my $sf = $self->db->upsert_scan_folder(FAKE_FOLDER_ID, FAKE_FOLDER_NAME);
$self->db->upsert_folder(sample_folder(scan_folder_id => $sf->{id}, name => 'OldName'));
my $updated = $self->db->upsert_folder(
sample_folder(scan_folder_id => $sf->{id}, name => 'NewName')
);
is $updated->{name}, 'NewName', 'folder name updated on conflict';
is $self->db->schema->resultset('Folder')->count, 1, 'no duplicate folder row';
}
sub get_folder_by_drive_id : Tests(2) {
my ($self) = @_;
my $sf = $self->db->upsert_scan_folder(FAKE_FOLDER_ID, FAKE_FOLDER_NAME);
$self->db->upsert_folder(sample_folder(scan_folder_id => $sf->{id}));
my $fld = $self->db->get_folder_by_drive_id('folder_drive_id_rock');
is $fld->{name}, 'Rock', 'folder found by drive_id';
( run in 0.778 second using v1.01-cache-2.11-cpan-39bf76dae61 )