On Fri, Jul 30, 2004 at 05:14:27PM -0700, Masahji Stewart wrote:
> Hey Tim,
> 
> I had a question about a module that I was designing to do SQL 
> translation between databases. I was going to implement it as a 
> database driver (DBD::Translate). Here's how it would be used:

The core translation code ought to live outside the DBI in an SQL::*
module so it's reusable in other contexts.

That module could then be used either by a DBI subclass, or by a
"layered driver" such as the DBD::Translate you're proposing.

The new version of DBD::Multiplex that'll be included in DBI v2 will
have hooks for callbacks that can be used for SQL translation.
Your SQL::* translation module could be easily plugged in that way.

Tim.


> <code>
> use DBI;
> 
> my $real_handle = DBI->connect('dbi:mysql:localhost', 'username',
> 'password');
> 
> # this means the underlying DBD::Translate module will parse oracle 
> queries
> # and convert them to whatever database that the $real_handle is 
> configured
> to use (mysql).
> my $translate_handle = DBI->connect('dbi:translate:oracle',
> $real_handle);
> 
> # obviously an Oracle query which will now be executing on the mysql
> database from the handle above.
> my $sth = $translate_handle->prepare('SELECT DECODE(user_id, NULL, '0',
> user_id) FROM users');
> $sth->execute();
> 
> while( my $row = $sth->fetchrow_hashref ) {
>    # ...
> }
> </code>
> 
> After looking around at your DBI TODO list, I noticed that the 
> $dbh->preparse method seems like this. I think. What exactly does the 
> preparse method do? is it anything like this?
> If so, will you require the driver implementers to handle the parsing 
> of their own language?
> 
> Please let me know and thanks in advance,
> 
> 
> -masahji
> 

Reply via email to