tetromino has asked for the wisdom of the Perl Monks concerning the following question:

I am trying to use DBI (DBD::SQLite) inside a Safe compartment, but I can't figure out a way to do it. My initial approach was to create a connection in the main program, then write a function to call do() etc. on that connection, and finally to share() the function into the safe compartment. Doesn't work:
$dbh = DBI->connect(...); sub foo { $dbh->do(...); } $compartment = new Safe; $compartment->share('&foo'); $compartment->reval('&foo();');
produces

Had to create DBI::_dbistate unexpectedly at ./mrmonitor.pl line 232.

and the program freezes.

So I tried creating a new connection inside the compartment:
sub foo { my $dbh = DBI->connect(...); $dbh->do(...); $dbh->disconnect(); }
and I get

Can't locate object method "connect" via package "DBI" (perhaps you forgot to load "DBI"?) at ./mrmonitor.pl line 228.

I could add "DBI::connect" (and a bunch of other DBI/DBD methods) to the compartment -- but that would defeat the entire purpose of a Safe compartment, because it would let user code access databases however it feels like.

Is there a solution to this problem, or should I just not use Safe in this case?

Replies are listed 'Best First'.
Re: Safe and DBI
by djantzen (Priest) on Apr 19, 2005 at 22:15 UTC

    How about a wrapper method around DBI::connect to restrict access to the database? You'd have that utility method and possibly others accessible in the Safe compartment but the core DBI methods would remain uncallable.

Re: Safe and DBI
by Joost (Canon) on Apr 19, 2005 at 22:11 UTC