#!/usr/local/bin/perl 

use UnixODBC qw(:all);
use Getopt::Long;

my $env;
my $cnh;
my $sth;
my $r;

## 
## DSN, username, and password from command line.
##

my $DSN;
my $UserName;
my $PassWord;

my $usage=<<EOH;
Usage: connectinfo [--help] | [--dsn=DSN --user=username --password=password]
  --help       Print this help and exit.
  --dsn        Data source name.
  --user       DBMS login name.
  --password   DBMS login password.
EOH

my $help;  # Print help and exit.

GetOptions ('help' => \$help,
	    'dsn=s' => \$DSN,
	    'user=s' => \$UserName,
	    'password=s' => \$PassWord);

if ($help || (not length ($DSN)) || (not length ($UserName)) 
	      || (not length ($UserName)) || (not length ($PassWord)))
     {
	 print $usage;
	 exit 0;
}


my ($ibuf, $ibuflen);

my %info_types = ('SQL_MAX_DRIVER_CONNECTIONS', 0,
		  'SQL_MAX_CONCURRENT_ACTIVITIES', 1,
		  'SQL_MAXIMUM_CONCURRENT_ACTIVITIES', 1,	
		  'SQL_DATA_SOURCE_NAME', 2,
		  'SQL_FETCH_DIRECTION', 8,
		  'SQL_SERVER_NAME', 13,
		  'SQL_SEARCH_PATTERN_ESCAPE', 14,
		  'SQL_DBMS_NAME', 17,
		  'SQL_DBMS_VER', 18,
		  'SQL_ACCESSIBLE_TABLES', 19,
		  'SQL_ACCESSIBLE_PROCEDURES', 20,
		  'SQL_CURSOR_COMMIT_BEHAVIOR', 23,
		  'SQL_DATA_SOURCE_READ_ONLY', 25,
		  'SQL_DEFAULT_TXN_ISOLATION', 26,
		  'SQL_IDENTIFIER_CASE', 28,
		  'SQL_IDENTIFIER_QUOTE_CHAR', 29,
		  'SQL_MAXIMUM_COLUMN_NAME_LENGTH', 30,
		  'SQL_MAXIMUM_CURSOR_NAME_LENGTH', 31,
		  'SQL_MAXIMUM_SCHEMA_NAME_LENGTH', 32,
		  'SQL_MAXIMUM_CATALOG_NAME_LENGTH', 34,
		  'SQL_MAX_TABLE_NAME_LEN', 35,
		  'SQL_SCROLL_CONCURRENCY', 43,
		  'SQL_TXN_CAPABLE', 46,
		  'SQL_TRANSACTION_CAPABLE', 46,
		  'SQL_USER_NAME', 47,
		  'SQL_TXN_ISOLATION_OPTION', 72,
		  'SQL_TRANSACTION_ISOLATION_OPTION', 72,
		  'SQL_INTEGRITY', 73,
		  'SQL_GETDATA_EXTENSIONS', 81,
		  'SQL_NULL_COLLATION', 85,
		  'SQL_ALTER_TABLE', 86,
		  'SQL_ORDER_BY_COLUMNS_IN_SELECT', 90,
		  'SQL_SPECIAL_CHARACTERS', 94,
		  'SQL_MAXIMUM_COLUMNS_IN_GROUP_BY', 97,
		  'SQL_MAXIMUM_COLUMNS_IN_INDEX', 98,
		  'SQL_MAXIMUM_COLUMNS_IN_ORDER_BY', 99,
		  'SQL_MAXIMUM_COLUMNS_IN_SELECT', 100,
		  'SQL_MAX_COLUMNS_IN_TABLE', 101,
		  'SQL_MAXIMUM_INDEX_SIZE', 102,
		  'SQL_MAXIMUM_ROW_SIZE', 104,
		  'SQL_MAXIMUM_STATEMENT_LENGTH', 105,
		  'SQL_MAXIMUM_TABLES_IN_SELECT', 106,
		  'SQL_MAXIMUM_USER_NAME_LENGTH', 107,
		  'SQL_OUTER_JOIN_CAPABILITIES', 115
		  );

$SIG{PIPE} = sub { print "SIGPIPE: ". $! . "\n"};

$r = SQLAllocHandle ($SQL_HANDLE_ENV, $SQL_NULL_HANDLE, $evh);
if (($r!=$SQL_SUCCESS)&&($r!=$SQL_NO_DATA)) {
    print "SQLAllocHandle evh: ";
   &getdiagrec ($SQL_HANDLE_ENV, $evh);
    exit 1;
}

$r = SQLSetEnvAttr($evh, $SQL_ATTR_ODBC_VERSION, $SQL_OV_ODBC2, 0);
if (($r!=$SQL_SUCCESS)&&($r!=$SQL_NO_DATA)) {
    &getdiagrec ($SQL_HANDLE_ENV, $evh);
    exit 1;
}

$r = SQLAllocHandle ($SQL_HANDLE_DBC, $evh, $cnh);
if (($r!=$SQL_SUCCESS)&&($r!=$SQL_NO_DATA)) {
    &getdiagrec ($SQL_HANDLE_ENV, $evh);
    exit 1;
}

$r = SQLConnect ($cnh, $DSN, $SQL_NTS,
			    $UserName, $SQL_NTS,
			    $PassWord, $SQL_NTS);
if (($r!=$SQL_SUCCESS)&&($r!=$SQL_NO_DATA)) {
    &getdiagrec ($SQL_HANDLE_DBC, $cnh);
    exit 1;
}

foreach my $it (keys %info_types) {
    $ibuf = '';
    $r = SQLGetInfo ($cnh, $info_types{$it},$ibuf, 255, $ibuflen);
    print "$it \= $ibuf\n" if length ($ibuf);
}

$r = SQLDisconnect ($cnh);
if (($r!=$SQL_SUCCESS)&&($r!=$SQL_NO_DATA)) {
    &getdiagrec ($SQL_HANDLE_DBC, $cnh);
    exit 1;
}

$r = SQLFreeConnect ($cnh);
if (($r!=$SQL_SUCCESS)&&($r!=$SQL_NO_DATA)) {
    &getdiagrec ($SQL_HANDLE_DBC, $cnh);
    exit 1;
}

$r = SQLFreeHandle ($SQL_HANDLE_ENV, $evh);
if (($r!=$SQL_SUCCESS)&&($r!=$SQL_NO_DATA)) {
    &getdiagrec ($SQL_HANDLE_ENV, $evh);
    exit 1;
}

sub getdiagrec {
    my ($handle_type, $handle) = @_;
    my ($sqlstate, $native, $message_text, $mlen);
    print 'SQLGetDiagRec: ';
    $r = &UnixODBC::SQLGetDiagRec ($handle_type, $handle, 1, $sqlstate,
				   $native, $message_text, 255,
				   $mlen);
    if ($r == $SQL_NO_DATA) { 
	print "result \= SQL_NO_DATA\n";
    } elsif (($r == 1) || ($r == 0)) { 
     print "$message_text\n";
    } else { 
     print "sqlresult = $r\n";
    }
    return $r;
}
