package AccessDB::Impl; use strict; use Win32::OLE; use Win32::OLE::Const 'Microsoft ActiveX Data Objects 2.7'; use Win32::OLE::Variant qw(:DEFAULT nothing); use CodeRefObj; use Hash::Util qw/lock_keys lock_hash lock_value unlock_value/; my @prop_names = qw/mdb_file state conn/; my %methods = ( 'open'=>\&open, 'close'=>\&close, 'execute'=>\&execute, 'getConnString'=>\&getConnString, 'free_resources'=>\&free_resources); my $conn_string1 = "Provider=MSDataShape;Data Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source="; my $conn_string2 = ";Mode=Share Deny None;Jet OLEDB:System database='';Jet OLEDB:Database Password=''"; sub init { my $file_name = shift; my (%properties); lock_keys(%properties, @prop_names); $properties{'state'} = 0; lock_value(%properties, 'state'); $properties{'conn'} = Win32::OLE->new('ADODB.Connection'); lock_value(%properties, 'conn'); $properties{'mdb_file'} = $file_name || ''; lock_hash(%methods); return CodeRefObj::create(\%properties, \%methods); } sub open { my $props = shift; $props->{'mdb_file'} = shift if @_; die "no mdb_file specified" unless $props->{'mdb_file'}; my $connection = join('', $conn_string1, $props->{'mdb_file'}, $conn_string2); $props->{'conn'}->Open($connection) unless $props->{'conn'}->{State}; die Win32::OLE->LastError() if Win32::OLE->LastError(); unlock_value(%{$props}, 'state'); $props->{'state'} = $props->{'conn'}->{State}; lock_value(%{$props}, 'state'); } sub close { my $props = shift; $props->{'conn'}->Close() if $props->{'conn'}->{State}; unlock_value(%{$props}, 'state'); $props->{'state'} = $props->{'conn'}->{State}; lock_value(%{$props}, 'state'); } sub execute { my $props = shift; my $sql = shift; $props->{'conn'}->Execute($sql); die "$sql" if Win32::OLE->LastError(); } sub getConnString { my $props = shift; return join('', $conn_string1, $props->{'mdb_file'}, $conn_string2); } sub free_resources { my $props = shift; unlock_value(%{$props}, 'conn'); $props->{'conn'}->Close() if $props->{'conn'}->{State}; $props->{'conn'} = nothing; } 1;