On Nov 26, 2013, at 12:42 AM, Tim Bunce <tim.bu...@pobox.com> wrote:

> Why not define a direct translation from a URL to a DBI DSN?
> A translation that doesn't require knowledge of any driver-specifics.

Because I want to the onus of connecting to the database to be on the 
developer, not the end-user. I personally don't want to have to look up the 
format of the URI for every database I connect to, and why the DBI DSN and JDBC 
URL formats annoy me. I would rather have one solid, standard way to handle 
most of the stuff needed for a connection string (host, port, username, 
password, database name) and then pass additional stuff in a standard way (a 
GET query string).

So I have implemented a `dbi_dsn` method on the database URI classes I’ve 
written. The base class uses the most commonly-used format, which DBD::Pg, for 
one, relies on:

    $ perl-MURI -E 'say 
URI->new("db:pg://me:sec...@example.com/foo.db")->dbi_dsn'
    dbi:Pg:dbname=me:secret.com/foo.db

And then in subclasses I overrode appropriate methods to change the format. 
Here’s Ingres, for example:

    $ perl -MURI -E 'say 
URI->new("db:ingres://me:sec...@example.com/foo.db")->dbi_dsn'
    dbi:Ingres:foo.db

And here’s SQL Server:

    $ perl -Ilib -MURI -E 'say 
URI->new("db:sqlserver://me:sec...@example.com/foo.db")->dbi_dsn' 
    dbi:ODBC:Driver={SQL Server};Server=me:secret.com;Database=foo.db

Note that the URI is the same for all of these, except for the "engine" part of 
the scheme. Additional Engine-specific parameters can be passed in the GET 
string, and will simply be passed, through, e.g.,:

    $ perl -Ilib -MURI -E 'say 
URI->new("db:pg://me:sec...@example.com/foo.db??connect_timeout=10&application_name=myapp")->dbi_dsn'
    
dbi:Pg:host=me:secret.com;dbname=foo.db;?connect_timeout=10;application_name=myapp

This puts the most of the onus on translating from the URL to the DBI DSN on 
the developer of the URI class (me in this case) rather than on the user.

Best,

David

Reply via email to