RSS Git Download  Clone
Raw Blame History
#!/usr/bin/perl

# http://www.perlfect.com/articles/sockets.shtml

BEGIN {
    use FindBin qw($Bin); # warn 'BIN:'.$Bin;
    # set lib paths for app:
    use lib (
		"$Bin/../lib",
        '/home/raj/perl5/lib/perl5',
	);
}

use strict;
use warnings;

use IO::All;
use IO::Socket; 
use IO::Handle;

use LIMS::Local::ScriptHelpers;
use Data::Dumper;
use DateTime;

my $tools = LIMS::Local::ScriptHelpers->new();
my $dbix  = $tools->dbix();

my $src = '/home/raj/scripts/socket_logs/socket.out.2';

my @file = io($src)->chomp->slurp; # warn Dumper @file;

my $tbl = 'request_haematology';

my @fields = qw(
    pda wbc wbc_f rbc rbc_f hb hb_f hct hct_f mcv mcv_f mch mch_f mchc mchc_f
    plt plt_f lymph_percent lymph_percent_f mixed_percent mixed_percent_f
    neutr_percent neutr_percent_f lymph lymph_f mixed mixed_f neutr neutr_f    
);

my %SQL = (
    request_id => q!select id from requests where request_number = ? and year = ?!,
    get_status => qq!select status from $tbl where request_id = ?!,
);
    
ROW:
for (@file) {
	my $data = parse_data($_); # warn Dumper $data;
    next ROW unless $data; # returns hashref or 0
    
    # get request ID from request_number & year:
    $dbix->query($SQL{request_id}, $data->{request_number}, $data->{year})
        ->into( my $request_id ); # warn $data->{request_id};
    next ROW unless $request_id; # in case lab number entry in wrong format
    
    # does request already have result:
    $dbix->query($SQL{get_status}, $request_id)->into(my $status);
    
    if ($status) { # exists - can only over-write if not already verified:
        next ROW if $status eq 'verified'; # can't overwite here (delete in app)
        $dbix->delete($tbl, { request_id => $request_id }); warn 'OVERWRITE';
    }
    # add request_id to $data & delete request_number & yr keys:
    $data->{request_id} = $request_id;
    delete $data->{$_} for qw(request_number year);
    # insert new data:
    $dbix->insert($tbl, $data);
}

=begin
our $data;

my $socket = IO::Socket::INET->new(
	LocalHost 	=> '163.160.171.164', # full IP address to accept external connections
	LocalPort 	=> 9001, 
	Proto 		=> 'tcp', 
	Listen 		=> 1, 
	ReuseAddr	=> 1 
) or die "Could not create socket: $!\n";
=cut

=begin
Now the socket is ready to receive incoming connections. To wait for a connection,
we use the accept() method which will return a new socket through which we can
communicate with the calling program. Information exchange is achieved by
reading/writing on the new socket. The socket can be treated like a regular
filehandle.
=cut

=begin
while (1) { # permanent
	# waiting for new client connection.
	my $client_socket = $socket->accept();

#	my $peer_address = $client_socket->peerhost();
#	my $peer_port = $client_socket->peerport();
#	print "Accepted New Client Connection From : $peer_address, $peer_port\n";

	# my $data = <$client_socket>;	
	# we can also read from socket through recv() in IO::Socket::INET
	$client_socket->read($data, 1024);
	print $data;
}
=cut

=begin
# flush after every write
$| = 1;
open my $fh, '>', 'socket.out' or die $!;
$fh->autoflush(1);

my $tools = LIMS::Local::ScriptHelpers->new();
my $dbix  = $tools->dbix();

while ( my $client_socket = $socket->accept ) {
	# my $peer_address = $client_socket->peerhost();
	# my $peer_port = $client_socket->peerport();
	# print "Accepted new client connection from : $peer_address, $peer_port\n";

    # read in 1024 chunks:
	while ( $client_socket->read($data, 131) ) { # warn Dumper [ $now->datetime, $data ];
		# print $fh DateTime->now->datetime . "\n$data\n";
		print $fh $data . "\n";
		my ($yr, $request_number) = $data =~ /D1U\d{16}(\d{2})\-(\d{5})/;
		if ( $yr && $request_number ) {
			warn Dumper [2000 + $yr, $request_number];
		}
	}	
}

close $socket;
=cut

sub parse_data {
	my $data = shift; # warn length $data;	
	
    my %h = (); # data hash to return
    
	my ($labno, @params) = $data =~ /
		D1U\d{16} # year,month,day + sample ID zero padding
		([\d-]{8})       # req. no. - 8 char, right-aligned eg 000012_1, 0012_100, 12_10000, etc
		(\w{6})          # PDA info
		\d               # RDW select || reserve
		([\d*]{4})(\d)   # wbc + flag
		([\d*]{4})(\d)   # rbc + flag
		([\d*]{4})(\d)   # hb + flag
		([\d*]{4})(\d)   # hct + flag
		([\d*]{4})(\d)   # mcv + flag
		([\d*]{4})(\d)   # mch + flag
		([\d*]{4})(\d)   # mchc + flag
		([\d*]{4})(\d)   # plt + flag
		([\d*]{4})(\d)   # lymph (%) + flag
		([\d*]{4})(\d)   # mixed (%) + flag
		([\d*]{4})(\d)   # neutr (%) + flag
		([\d*]{4})(\d)   # lymph (#) + flag
		([\d*]{4})(\d)   # mixed (#) + flag
		([\d*]{4})(\d)   # neutr (#) + flag
#		.*{5}            # rdw - don't need
#		.*{5}            # pdw - don't need
#		.*{5}            # mpv - don't need
#		.*{5}            # p-lrc - don't need
	/x;
	
    unless ($labno && @params) {
        warn $data; # need to log with timestamp
        return 0;
    }

    # split $labno on '-':
    my ($yr, $request_number) = split '-', $labno;    
    return 0 unless $yr && $request_number; # warn Dumper [$yr, $request_number];
    
    # create hash of data:
	@h{@fields} = @params; # warn Dumper \%h;
    
    # add request_number & year:
    $h{request_number} = $request_number;
    $h{year} = $yr + 2000; # warn Dumper \%h;
	return \%h;
}