package tracker;
require DBI;

# -------------- Configurable variables start --------------
#this is the directory where tracker will look for the SNMP mib files
$home_dir = "/home/tracker/";

#hash table with database configuration
my %db;
$db{backend} = "postgres";
#$db{backend} = "mysql";
$db{name} = "tracker";
#$db{host} = "";
#$db{user} = "";
#$db{password} = "":
#database autocommit behaviour, 1 is safer.  0 works at least for postgres
$db{autocommit} = 0;
#Database error handling, 1 causes scripts to die on error,
#0 returns the error and continues
$db{raiseerror} = 0;

# -------------- Configurable variables end ----------------

# Return a DBI handle to the database
sub conndb
	{
	my $db_connect_string;
	if ($db{backend} eq "mysql")
		{ $db_connect_string = "dbi:mysql:database=$db{name}" }
	elsif ($db{backend} eq "postgres")
		{ $db_connect_string = "dbi:Pg:dbname=$db{name}" }
	else
		{ return }
	if ($db{host})
		{ $db_connect_string .= ";host=$dbhost" }	
	return DBI->connect($db_connect_string, $db{user}, $db{password}, { RaiseError => $db{raiseerror}, AutoCommit => $db{autocommit} })
	}


@phy_types = (qw(
undefined
other
cddi
fddi
tppmd
mlt3
sddi
smf
e10BaseT
e10BaseF
scf
e100BaseTX
e100BaseT4
e100BaseF
atmOc3mmf
atmOc3smf
atmOc3utp
e100BaseFsm
e10a100BaseTX
mii
vlanRouter
remoteRouter
tokenring
atmOc12mmf
atmOc12smf
atmDs3
tokenringMmf
e1000BaseLX
e1000BaseSX
e1000BaseCX
networkAnalysis
e1000Empty
e1000BaseLH
e1000BaseT
e1000UnsupportedGbic
e1000BaseZX
depi2
t1
e1
fxs
fxo
transcoding
conferencing ));
$phy_types[55] = "Intrusion";

@admin_states = (qw(undefined up down testing ));

@admin_duplex = (qw(undefined half full disagree auto ));

sub reformat_rtr_mac
	{
	my ($old_mac_addr) = @_;
	my $new_mac_addr;
	$old_mac_addr =~ s/\.//g;
	$new_mac_addr = substr($old_mac_addr,0,2);
	for ($i = 2 ; $i < 12 ; $i+=2 )
		{
		$new_mac_addr .= "-" . substr($old_mac_addr,$i,2)
		}
	$new_mac_addr;
}


sub log
	{
	my $msg = shift;
	#connect to the database
	my $dbconn = tracker::conndb();
	unless ($dbconn)
		{
		print "Logging error: Database connect failed.\n", $msg;
		return
		}
	my $query = sprintf "INSERT INTO log (time, message) VALUES (CURRENT_TIMESTAMP, %s);",
		$dbconn->quote(tracker::dbescape($msg));
	my $insert = $dbconn->prepare($query);
	unless ($insert->execute)
		{
		print "Logging error, database insert failed. DB error:\n$dbconn->errstr\n", 
		"Log entry:\n$msg\n";
		$dbconn->disconnect;
		return;
		}
	$dbconn->commit;
	$dbconn->disconnect;
	}

sub timestamp
	{
	my ($field) = @_;
	if ($db{backend} eq "mysql")
		{ return  "date_format(" . $field . ", '%W %M %D %Y %r')" }
    	elsif ($db{backend} eq "postgres")
#		This should work for newer verisons of postgres
		{ return "to_char(" . $field . ", 'FMDay FMMon FMDDth YYYY FMHH12:MIam')" }
#		But this is compatible back to version 6.5
#		{ return "datetime($field)" }
 	}


sub offset
	{
	my ($window,$real_offset) = @_;
	if ($db{backend} eq "mysql")
		{ return "LIMIT $real_offset,$window" }
    	elsif ($db{backend} eq "postgres")
		{ return "LIMIT $window OFFSET $real_offset" }
	}	
	
sub dbescape
	{
	my $scratch = shift;
	$scratch =~ s/[^\x0a\x0d\x20-\x7e]/\[INVALID CHARACTER\]/g;
	return $scratch
	}


1;
