www.pudn.com > filecollector.rar > WriteDallog.pm


package WriteDallog;

###############################################################################
#
#  @(#) Perl Module: WriteDallog
#
#  Copyright(C) 2002-2004 BOCO Inter-Telecom DC Team, All Rights Reserved
#
#  Author(s): JIA XL
#
#  Creation Date:  2003/01/15
#
#  Last update Date: 2003/02/25
#
#  Description:
#
#
##############################################################################

use strict;

use DBI;
use IO::String;
use XML::Writer;
use Data::Dumper;
use Date::Format;
use MQClient::MQSeries;
use MQSeries::QueueManager;
use MQSeries::Queue;
use MQSeries::Message;

use DBIs;
use LDAP_API;

#######################################################################
#
# Function: new
#
# Input: null
#
# Output:
#
# Description:
#
#######################################################################

sub new {
	my ($type,$common_part) = @_;
	my $self = {};
    	$self->{'mq_handle'}=0; 
    	$self->{'db_handle'}=0; 
    	$self->{'common'}=$common_part; 
    	bless $self, $type;
    	return $self;
}

#######################################################################
#
# Function: connect_MQ
#
# Input: 
#
# Output:
#
# Description: 
#
#######################################################################

sub connect_MQ {
	my ($self,$qmgrname,$requestqname,$mode)=@_;
	
	#-------------------------------
    	# Step one: connect to the queuemanager.
	#-------------------------------
    	my $reason;
    	my $qmgr = MQSeries::QueueManager->new( QueueManager => $qmgrname ) || return -1;

	#---------------------------
    	# Step two: open the dest queue 
	#---------------------------
    	my $connect = MQSeries::Queue->new
    		(
      		QueueManager		=> $qmgr,
      		Queue		=> $requestqname,
      		Mode			=> $mode,
      		Reason                    => \$reason,
     		) || return -1;

     	$self->{'mq_handle'}=$connect;
     
     	return 1;
}

######################################################################
#
# Function: FmtHASH2XML
#
# Input:
#
# Output:
#
# Description:
#
#######################################################################

sub FmtHASH2XML {
	my ($self,$hash_ref) = @_;
	#print "Hash Structure:",Dumper($hash_ref);
        my $xml_str;
        my $output = IO::String->new($xml_str);
        my $write_hdl = XML::Writer->new(
                                OUTPUT => $output,
                                NEWLINES => 1
                        );
        $write_hdl->xmlDecl("gb2312");
        $write_hdl->startTag('Message');
        $self->WriteXmlBody($hash_ref,$write_hdl);
        $write_hdl->endTag('Message');
        $write_hdl->end();
        $output->close();
	#print "\nXML String: $xml_str \n";
        return ($xml_str);
}

######################################################################
#
# Function: WriteXmlBody
#
# Input:
#
# Output:
#
# Description: it's called by sub FmtHASH2XML
#
#######################################################################

sub WriteXmlBody {
        my ($self,$hash_ref,$write_hdl) = @_;
        foreach my $key (keys %$hash_ref) {
                if (ref($hash_ref->{$key})) {
                        $write_hdl->startTag($key);
                        $self->WriteXmlBody($hash_ref->{$key},$write_hdl);
                        $write_hdl->endTag($key);
                }
                elsif ( $key !~ /HASH/ ) {
                        $write_hdl->startTag($key);
                        $write_hdl->characters($hash_ref->{$key});
                        $write_hdl->endTag($key);
                }
        }
	#print "Success to Format HASH2XML \n";
}

#######################################################################
#
# Function: send_MQ
#
# Input:
#
# Output:
#
# Description:
#
#######################################################################

sub send_MQ {
	my ($self,$msg,$msg_type) = @_ ;
	if (!$msg_type) {
		$msg_type =1280;
	}
	$msg_type += 65536;
      	my $sendmsg = MQSeries::Message->new (
		MsgDesc		=> {
			MsgType		=> $msg_type,
		},
       		Data		=> $msg,
      	);

    	#-------------------------- 
      	# send MSG to MQGR queue 
    	#-------------------------- 
     	($self->{mq_handle})->Put(Message => $sendmsg);
      	if((($self->{mq_handle})->CompCode()== &MQCC_OK) || (($self->{mq_handle})->CompCode()== &MQCC_WARNING)) {
		return 1;
	}
      	if(($self->{mq_handle})->CompCode()== &MQCC_FAILED) {
        	print "the reason is ($self->{mq_handle})->Reason()\n";
         	return -1;
      	}

}

#######################################################################
#
# Function: receive_MQ
#
# Input:
#
# Output:
#
# Description:
#
#######################################################################

sub receive_MQ {
	my ($self,$pollrate) = @_ ;
     	my $request = MQSeries::Message->new();
 
    	while(1) {
      		($self->{mq_handle})->Get (
           		Message 	=> $request,
           		Wait	        => $pollrate,
         	);
      
      		if(($self->{mq_handle})->CompCode()== &MQCC_OK || ($self->{mq_handle})->CompCode()== &MQCC_WARNING) {
         		#print "Request: " . $request->Data() . "\n";
         		my $receive_data = $request->Data();
         		return $receive_data;
      		}
      		if(($self->{mq_handle})->CompCode()== &MQCC_FAILED) {
			my $reason = ($self->{mq_handle})->Reason();
         		print "the failed reason:\n",$reason,"\n";
         		if (($self->{mq_handle})->Reason() == &MQRC_NO_MSG_AVAILABLE) {
	    			print "Timed out waiting for requests.  Retrying...\n";
	    			return 0;
         		} 
         		return -1;
      		}
      
    	}

}

#######################################################################
#
# Function: mq_commit
#
# Input:
#
# Output:
#
# Description:
#
#######################################################################

sub mq_commit {
	my ($self) = @_;
    	if((($self->{mq_handle})->Commit())==1) {
       		print "commit the MQ transaction successful\n";
       		return 1;
    	}else{
       		print "commit the MQ transaction failed\n"; 
       		return 0;
    	}
}

#######################################################################
#
# Function: mq_rollback
#
# Input:
#
# Output:
#
# Description:
#
#######################################################################

sub mq_rollback {
	my ($self) = @_;
	if((($self->{mq_handle})->Backout())==1) {
       		print "rollback the MQ transaction successful\n";
       		return 1;
    	}else{
       		print "rollback the MQ transaction failed\n"; 
       		return 0;
    	}
}

#######################################################################
#
# Function: ConnectDb
#
# Input:
#
# Output:
#
# Description:
#
#######################################################################

sub connect_DB {
	my ($self,$db_type,$db_server,$database,$user,$passwd) = @_;

	my $connect_str;
        if ($db_type =~ /informix/i) {
		$db_type='Informix';
                $connect_str = "dbi:$db_type:$database" . "\@$db_server";
        }
        elsif ($db_type =~ /oracle/i) {
		$db_type='Oracle';
                $connect_str = "dbi:$db_type:$db_server";
        }
        my $db_hdl = DBI->connect($connect_str, $user, $passwd);
	my $lock_mode = "set lock mode to wait 60";
	$db_hdl->do($lock_mode);

        if (!$db_hdl) {
                my $err_msg = "Error: Can not connect to database $db_server: $DBI::errstr\n";
                return (-1,$err_msg);
        }

	$self->{'db_handle'} = $db_hdl;

	return 1;
}

#######################################################################
#
# Function: WritelogTbl
#
# Input:
#
# Output:
#
# Description: Get arguments from command line
#

#######################################################################

sub WritelogTbl {
	my ($self,$hash_ref,$table_name) = @_;

	if (!$table_name) {
		$table_name = 'dal_log';
	}
	my $db_hdl = $self->{'db_handle'};

        my (@column,@values);
        my $i=0;
        foreach my $key (keys %$hash_ref) {
                $column[$i] = $key;
                $values[$i] = $hash_ref->{$key};
                $i++;
        }
        my $insert_sql = "insert into $table_name (";
	my $value_str = '';
        for ($i=0;$i<@column;$i++) {
                $insert_sql .= $column[$i].",";
		$value_str  .= "?,";
        }
        chop $insert_sql;
	chop $value_str;
        $insert_sql = $insert_sql.")"." values ($value_str)";
        #print "\n\nWriting log_table SQL:\n\t$insert_sql\n\n";
	my ($r,$str);
        my $sth = $db_hdl->prepare($insert_sql)|| (($r=$DBI::err)&&($str=$DBI::errstr));
        if ($r) {
                $db_hdl->rollback;
                return (-1,"$str");
        }
        for ($i=1;$i<=@values;$i++) {
                my $j = $i-1;
                $sth->bind_param($i,$values[$j]);
        }
        $sth->execute || (($r=$DBI::err) &&($str=$DBI::errstr));
        if ($r) {
                return (-1, "\n$str");
        }

        return (1,"Success\n");
}

sub close {
	my ($pkg) = @_;

	undef($pkg);
	return($pkg);
}


return 1;