#!/usr/local/bin/perl
use strict;
use warnings;
use utf8;
use DBI;
use Date::Calc qw/Today_and_Now/;
use FindBin;
use Proc::Daemon;

my $PID;	#process id
my $PID_FILE = $FindBin::Bin."/daemon.pid";
my $SLEEP_INTERVAL = 10;
my $CONF_DB =
    {host =>    "localhost",
     db_name=>  "test",
     db_user=>  "root",
     db_pass=>  ""
    };
my $DBH;

main(@ARGV);
exit(0);

sub main {
    my ($act) = @_;
    $act ||="";

    if ($act eq "start"){	#daemonの起動
	#複数の起動はできません
	if( get_pid_file() ){
	    print "$0 is already running\n";
	    return;
	}
	init();
	run();
	return;
    }

    if ($act eq "stop"){	#daemonの停止
	my $pid = get_pid_file();
	if(not defined $pid){
	    print "$0 is not running\n";
	    return;
	}
	#pid fileを削除すると、後でkillされます
	return del_pid_file();
    }

    print "usage: $0 [start|stop]\n";
    return;
}

sub init {
    Proc::Daemon::Init;	#daemon化

    #signal送信時に実行するmethod
    $SIG{INT} = $SIG{HUP} = $SIG{QUIT} = $SIG{KILL} = $SIG{TERM} ='interrupt';

    $PID = $$;
    set_pid_file($PID);
    $DBH = connect_db();
}

sub run {
    while(1) {
        action();	#actionの内容は、自由に編集してください
        sleep($SLEEP_INTERVAL);

	#pidファイルが削除されていれば、自分自身をkillします
	if (not get_pid_file() ){
	    $DBH->disconnect;
	    kill $PID;
	    return;
	}
    }
}

sub interrupt {	#signal送信時に実行されます
    my ($sig) = @_;
    $SIG{$sig} = 'IGNORE';
    return del_pid_file();
}

sub get_pid_file {	#pid fileの名称とpidの取得
    return undef if not -e $PID_FILE;

    open my $fh, $PID_FILE or die "can't open $PID_FILE :$!";
    my ($line) = <$fh>;
    close $fh or die "can't close $PID_FILE :$!";

    my ($pid) = $line =~ /(\d+)/o;
    return ($PID_FILE,$pid);
}

sub set_pid_file {	#pid fileにpidを書き込み
    my ($process_id) = @_;
    open my $fh, ">$PID_FILE" or die "can't open $PID_FILE :$!";
    print $fh $process_id;
    close $fh or die "can't close $PID_FILE :$!";
}
sub del_pid_file {
    unlink $PID_FILE or die "can't unlink $PID_FILE :$!";
}

sub action {
    my $sql =<<EOF;
insert into test_sid (time_val) values(?)
EOF
    my $sth = $DBH->prepare($sql);
    my @now = Today_and_Now();
    my $now_str = "$now[0]-$now[1]-$now[2] $now[3]:$now[4]:$now[5]";
    $sth->execute($now_str);
    $DBH->commit;
    return 1;
}

sub connect_db {
    my $db = "DBI:mysql:database=$CONF_DB->{db_name};host=$CONF_DB->{host}";
    return DBI->connect($db, $CONF_DB->{db_user}, $CONF_DB->{db_pass});
}
1;
