package mmtlog;

=pod

=head1 NAME

mmtlog.pm - マスタメンテリストモジュール

=head1 概要

マスターメンテモジュールのログ(DBIのログファイル)より
マスターメンテリストを作成用のモジュール

=cut

sub new{
	my $class = shift;
	my $self ={};
	$self = shift;
	bless $self,$class;
	return $self;
}
sub log_open{
	$s = shift;
	open(LOG,$s->{file}) or return $@;
	$s->{LOG} = LOG;
	return $s;
}
sub log_get{
	my $s = shift;
	my ($line,$line2);
	my $fh = $s->{LOG};
	while($line = <$fh>){
		next unless($line =~ /Binding.*(insert|update|delete|replace)/);
		chomp $line;
		while($line2 = <$fh>){
			if($line2 =~ /^\s*(->|<-)/){ return $line;}
			chomp $line2;
			$line .= $line2;
		}
	}
	return $line;
}
sub log_close{
	my $s = shift;
	close($s->{LOG});
}
sub log_head_get{
	my $s = shift;
	my $r = shift;
	my ($line,$line2) ;
	$s->log_open;
	while($line = $s->log_get){
		if($line =~ /(insert|update|replace)\s+(\S+)\s/){
			while($line2 = <$fh>){
				last if($line2 =~ /^\s*(->|<-)/);
				chomp $line2;
				$line .= $line2;
			}
			$s->log_split({'line'=>$line,'head'=>$r->{head},
					'data'=>$r->{data}});
			$r->{data}[0] = $2;
			last ;
		}
	}
	$s->log_close;
}
	
sub log_split{
	my $s = shift;
	my $r = shift;
	my (@tmp,$k,$d) ;
	if ($r->{line} =~ /insert.*\((.*)\).*values\s*\((.*)\)/){
		$r->{head}[0] = '処理';
		$r->{data}[0] = '登録';
		push @{$r->{head}},split(",",$1);
		push @{$r->{data}},map { /^'(.*)'$/} $s->csv_split($2);
	}
	if ($r->{line} =~ /replace.*\((.*)\).*values\s*\((.*)\)/){
		$r->{head}[0] = '処理';
		$r->{data}[0] = '入力';
		push @{$r->{head}},split(",",$1);
		push @{$r->{data}},map { /^'(.*)'$/} $s->csv_split($2);
	}
	if ($r->{line} =~ /update.*set\s+(.*)\s+where\s+(.*)$/){
		$r->{head}[0] = '処理';
		$r->{data}[0] = '修正';
		for(split(/\s+and\s+/,$2)){
			($k,$d) = split(' = ',$_);
			push @{$r->{head}},$k;
			push @{$r->{data}},map {/^'(.*)'/} $d;
		}
		for(split(",",$1)){
			($k,$d) = split(' = ',$_);
			push @{$r->{head}},$k;
			push @{$r->{data}},map {/^'(.*)'/} $d;
		}
	}
	if($r->{line} =~ /delete.*\s+where\s+(.*)$/){
		$r->{head}[0] = '処理';
		$r->{data}[0] = '削除';
		for(split(/\s+and\s+/,$1)){
			($k,$d) = split(' = ',$_);
			push @{$r->{head}},$k;
			push @{$r->{data}},map {/^'(.*)'/} $d;
		}
	}
}
#------------------------------------------------------------------------#
sub csv_split{
#------------------------------------------------------------------------#
  my $self = shift;
  my $tmp = shift;
  $tmp =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
  return map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_}
                ($tmp =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
}

=head1 AUTHOR INFORMATION

 ;######################################################################
 ;#
 ;# mmtlog.pm: マスタメンテリスト作成モジュール
 ;#
 ;# Copyright (c) 2004 Masashi Hori <hori@japannet.co.jp>
 ;# JapanNet. All Rights Reserved.
 ;#
 ;#
 ;######################################################################

=cut

1;
