#!/usr/local/bin/perl

use DBI ();
use DBD::Oracle qw(:ora_types);
use Storable qw(thaw);

#
# This string is the nfreeze of a decent sized
# hash.
#
$orig = q{   “
	25-FEB-69X   BDAY
1X   	BR1_PUTTS
0X   	BR2_FWHIT
0X   MR_BIRDIEAVE
Robert AlexisX   	FIRSTNAME
1X   MR_TOTOTHERS
0X   MR_EAGLESAVE
0X   BR2_BIRDIEAVE
1X   BR2_TOTOTHERS
1X   BR1_TOTPARS
1X   BR2_TOTPARS
0X   BR2_EAGLESAVE
1X   BR1_TOTBOGIES
Robert Alexis LockerbyX   GREETING
1X   BR1_PAR4AVE
1X   BR2_PAR4AVE

San DiegosX   CITY
1X   BR2_TOTDBOGIES
0X   
BR2_SSAVES
0X   	MR_UPDOWN
1X   MR_PUTT1
1X   MR_PUTT2
1X   MR_PUTT3
0X   BR1_PENALTY
0X   BR2_PENALTY
totscoreX   	MR_FILTER
nsadmin@somewhere.comX   EMAIL
1X   	SC_RNOTES
1X   MR_TOTDBOGIES
1X   
MR_PAR5AVE
mxyzptlkX   PASSWORD
1X   SC_PUTTS
23X   	MR_CUSTOM
1X   
BR1_SSAVES
29450X   
HOMECOURSE
1X   MR_PUTTS
1X   
BR2_OPTION
rlockeX   NAME
0X   SC_DRIVEDIST
0X   MR_STRAPAVE
1X   CONTACTFLAG
1X   	BR1_FWHIT
0X   BR2_GIR
0X   BR1_DBOGIEAVE
1X   BR1_STRAPAVE
1X   MR_TOTBOGIES
FNDX   HEARDCDE
1X   BR2_TOTBOGIES
0X   MR_AVGDRIVE
0X   	MR_GIRAVE
1X   MR_FWHITAVE
0X   BR1_AVGDRIVE
1X   BR2_TOTBIRDIES
0X   SC_STRAP
GSX   
COUNTRYCDE
NetHandicapX   a_type
0X   BR1_FWHITAVE
PETX   QUESTIONCDE
0X   
BR2_PARAVE
1X   	SC_DETAIL
5X   	MR_FREQNO
0X   BR2_STRAPAVE
0X   
MR_PUTTGIR
1X   
MR_PAR3AVE
passX   LastLoginFailure
MX   GENDER
0X   BR1_OTHERSAVE
1X   SC_FWHIT
1X   MR_TOTBIRDIES
1X   BR1_PAR5AVE
1X   BR2_PAR5AVE
0X   BR2_AVGDRIVE
0X   MR_BOGIEAVE
1X   MR_FWHIT
1X   MR_GIR
0X   
BR2_UPDOWN
0X   
BR1_PARAVE
0X   BR2_FWHITAVE
22X   
HCHANDICAP
0X   MR_DBOGIEAVE
0X   BR1_BOGIEAVE
1X   
MR_PUTTAVE
Arnel EstanislaoX   
REFERREDBY
0X   BR2_DBOGIEAVE
totputtsX   
BR2_FILTER
0X   SC_ALL
0X   
SC_PENALTY

sadfasfasdX   ZIP
LockeX   LASTNAME
12 Valley RoadX   ADDRESS1
asdfsadfasdfasdf saf safd saf X   ADDRESS2
%Jackson Hole Golf & Tennis Club / RedX   HOMECOURSE_NAME
 X   
BR2_CUSTOM
NetHandicapX   a_name
0X   
BR1_UPDOWN
1X   	BR2_PUTT1
1X   	BR2_PUTT2
1X   	BR2_PUTT3
 X   MESSAGE
0X   BR2_BOGIEAVE
	eaglesaveX   
BR1_FILTER
1X   BR1_TOTEAGLES
CAX   STATECDE
125X   HCSLOPE
0X   MR_OTHERSAVE
0X   BR1_PUTTGIR
0X   	MR_SSAVES
1X   BR2_PUTTGIR
2000X   MEMBERNO
1X   BR1_PAR3AVE
0X   BR2_OTHERSAVE
1X   SC_GIR
1X   BR2_PAR3AVE
1X   BR1_TOTDBOGIES
1X   MR_DRIVEMAX
2X   
BR1_CUSTOM
 X   LoginFailure
0X   
BR2_GIRAVE
1X   BR1_DRIVEMAX
1X   	BR2_PUTTS
1X   BR1_GIR
173X   ROUNDS_POSTED
1X   
MR_TOTPARS
0X   BR1_PUTTAVE
0X   BR2_PUTTAVE
0X   BR1_BIRDIEAVE
/X   uri
5X   
BR2_FREQNO
1X   BR1_TOTOTHERS
0X   BR1_EAGLESAVE
1X   
MR_PAR4AVE
0X   
MR_PENALTY
0X   
BR1_GIRAVE
1X   	BR1_PUTT1
1X   	BR1_PUTT2
1X   	BR1_PUTT3
1X   BR2_DRIVEMAX
0X   	SC_HNOTES
1X   MR_TOTEAGLES
1X   BR2_TOTEAGLES
0X   
BR1_FREQNO
OrcaX   ANSWER
1X   	LOGINFLAG
(800) 655-8971X   PHONE
1X   BR1_TOTBIRDIES
0X   	MR_PARAVE
20X   NETHANDICAPX};

#
# Save the above string to a database.
# Table is called "storable", with a single 
# column of type LONG.
#
$ENV{ORACLE_HOME} = "/usr/OraHome1/";
$dbh = DBI->connect('dbi:Oracle:', '<LOGIN INFO HERE>');

$sth = $dbh->prepare(qq{INSERT INTO storable VALUES (?)});

$sth->bind_param(1, $orig, {ora_type => ORA_LONG});

$sth->execute;
$sth->finish;

#
# Now, fetch the string we just stored from the database.
#
$dbh->{LongReadLen} = 100000;

$sth = $dbh->prepare(qq{SELECT a_session FROM storable});
$sth->execute;

$results = $sth->fetchrow_arrayref;
$stored = $results->[0];

#
# Compare the fetched string against the original.
#
if ($orig ne $stored) {
    print "Binary strings DIFFER...", "\n";
} else {
    print "Binary strings are the SAME...", "\n";
}

#
# As a final test, see if we can thaw out the data
# structure.
#
$href = thaw($stored);

for $key (sort keys %$href) {
    print $key, ": ", $href->{$key}, "\n";
}
