+use threads;
+use Thread::Queue;
+
+for my $state (qw(get parse)) {
+ my %databases;
+ for my $database (keys %{$actions{$state}}) {
+ next unless @{$actions{$state}{$database}};
+ $databases{$database}{queue} = Thread::Queue->new;
+ $databases{$database}{thread} = threads->new(\&handle_action($state,$database,$databases{database}{queue}));
+ $databases{$database}{queue}->enqueue(@{$actions{$state}{$database}});
+ $databases{$database}{queue}->enqueue(undef);
+ }
+ my $ERRORS=0;
+ for my $database (keys %databases) {
+ my ($actioned_keywords,$failed_keywords) = $databases{$database}{thread}->join;
+ if (@{$failed_keywords}) {
+ ADVISE("These keywords failed during '$state' of '$database':",@{$failed_keywords});
+ $ERRORS=1;
+ }
+ @{$state{done_keywords}{$state}{$database}}{@{$actioned_keywords}} = (1) x @{$actioned_keywords};
+ delete @{$state{done_keywords}{$state}{$database}}{@{$failed_keywords}};
+ }
+ save_state(\%state);
+ if ($ERRORS) {
+ WARN("Stoping, as there are errors");
+ exit 1;
+ }
+}
+
+if ($actions{combine}) {
+ save_state(\%state);
+ # deal with combining results
+ my @parsed_results = map { my $db = $_;
+ map {
+ "parsed_results_${db}_${_}.txt"
+ } keys %{$state{done_keywords}{parse}{$db}}
+ } keys %{$state{done_keywords}{parse}};
+
+ write_command_to_file('combined_results.txt',
+ "$base_dir/combine_results",
+ @parsed_results,
+ );
+ for my $result (@parsed_results) {
+ s/^parsed_results_//;
+ s/\.txt$//;
+ my ($db,$keyword) = split /_/, $_, 2;
+ $state{done_keywords}{combined}{$db}{$keyword} = 1;
+ }
+ save_state(\%state);
+ ADVISE("Finished; results in $options{results}/combined_results");
+}
+else {
+ ADVISE('Nothing to do. [Perhaps you wanted --restart-at?]');