package MyDB ; use strict; use warnings; use DBI; use Exporter qw(import); our %EXPORT_TAGS = ('all' => [ qw( db_connect ) ], ); our @EXPORT_OK = ( @{$EXPORT_TAGS{'all'}} ); our $VERSION = 0.0.1; our %_DB = ( default => { user => 'YouDontGetThis', password => 'YouDontGetThis', host => 'YouDontGetThis', port => '3306', database => 'YouDontGetThis', }, test => { user => 'YouDontGetThis', password => 'YouDontGetThis', host => 'YouDontGetThis', port => '3306', database => 'YouDontGetThis', }, ); my $_db_params = ''; # String of current database parameters. my $_dbh; # Save the handle. sub db_connect { my ($param_ptr, $attr_ptr) = @_; # If database is already opened then check for a fast return. if (defined $_dbh && (!defined $param_ptr || $param_ptr eq '')) { return $_dbh } # Check for a different set of parameters to use via a the name (string) # of the parameter (e.g., 'test'). my $which_db = 'default'; if (defined $param_ptr && ref($param_ptr) eq '' && $param_ptr ne '') { if (defined $_DB{$param_ptr}) { $which_db = $param_ptr } else { return; } } # Get the base parameters ... copy and flatten from global array my %params = (); my %attr = (); foreach (keys %{$_DB{$which_db}} ) { $params{$_} = $_DB{$which_db}{$_}; } # Add in extra parameters if given and if the database is not the default. if (defined $param_ptr && ref($param_ptr) eq 'HASH' && (!defined $param_ptr->{database} || $param_ptr->{database} ne 'default') ) { foreach (keys %{$_DB{default}}) { if (defined $param_ptr->{$_}) { $params{$_} = $param_ptr->{$_} } } } if (defined $attr_ptr && ref($attr_ptr) eq 'HASH') { foreach (keys %$attr_ptr) { $attr{$_} = $attr_ptr->{$_} } } # Now make up an order string of the parameters so that we can compare # them to the old ones. my $new_db_params = ''; foreach (sort keys %params) { $new_db_params .= $params{$_} }; # Can also do a quick return if params are same as old ones if (defined $_dbh && $new_db_params eq $_db_params) { return $_dbh; } # At this point either the database has never been opened or # new parameters are to be used. Close database and reopen. $_db_params = $new_db_params; if (defined $_dbh) { $_dbh->disconnect } # no error check my $source = "dbi:mysql:$params{database}:$params{host}:$params{port}"; $_dbh = DBI->connect($source, $params{user}, $params{password}, \%attr); return $_dbh; } # End of db_connect 1;
For the particulars, I used something, I think WolframAlpha, to get the latitude and longitude of each capital, then looked into some geometry to calculate the distances. Perhaps I should include some database dumps here. for that info.
No comments:
Post a Comment