# NAME DBIx::Class::Schema::Config - Manage connection credentials for DBIx::Class::Schema in a file. # SYNOPSIS /etc/dbic.yaml MY_DATABASE: dsn: "rbi:Pg:host=localhost;database=blog" user: "TheDoctor" password: "dnoPydoleM" options: TraceLevel: 1 package My::Schema use warnings; use strict; use base 'DBIx::Class::Schema::Config'; __PACKAGE__->load_namespaces; package My::Code; use warnings; use strict; use My::Schema; my $schema = My::Schema->connect('MY_DATABASE'); # DESCRIPTION DBIx::Class::Schema::Config is a subclass of DBIx::Class::Schema that allows the loading of credentials from a file. The actual code itself would only need to know about the name of the database, this aims to make it simpler for operations teams to manage database credentials. # CONFIG FILES This module will load the files in the following order if they exist: * ./dbic.* * ~/.dbic.* * /etc/dbic.* The files should have an extension that Config::Any recognizes, for example /etc/dbic.__yaml__. NOTE: The first available credential will be used. Therefore DATABASE in ~/.dbic.yaml will only be looked at if it was not found in ./dbic.yaml. If there are duplicates in one file (such that DATABASE is listed twice in ~/.dbic.yaml) the first configuration will be used. ## CHANGE CONFIG PATH Use `__PACKAGE__->config_paths([( '/file/stub', '/var/www/etc/dbic')]);` to change the paths that are searched. For example: package My::Schema use warnings; use strict; use base 'DBIx::Class::Schema::Config'; __PACKAGE__->config_paths( [ ( '/var/www/secret/dbic', '/opt/database' ) ] ); The above code would have `/var/www/secret/dbic.*` and `/opt/database.*` searched. As above, the first credentials found would be used. # OVERRIDING The API has been designed to be simple to override if you need more specific configuration loading. ## load_credentials Override this function to change the way that DBIx::Class::Schema::Credentials loads credentials, the functions takes the class name, as well as a hashref. If you take the route of having `->connect('DATABASE')` used as a key for whatever configuration you are loading, 'DATABASE' would be `$config->{dsn}` Some::Schema->connect( "dbi:Pg:dbname=blog", "user", "password", { TraceLevel => 1 } ) Would result in the following data structure as $config in `load_credentials($class, $config)`: { dsn => "dbi:Pg:dbname=blog", user => "user", password => "password", options => { TraceLevel => 1, }, } It if the responsibility of this function to allow passing through of normal `->connect` calls, this is done by returning the current configuration if the dsn matches ^dbi:. The function should return the same structure. For instance: package My::Credentials use warnings; use strict; use base 'DBIx::Class::Schema::Credentials'; use LWP::Simple; use JSON # Load credentials from internal web server. sub load_credentials { my ( $class, $config ) = @_; return $config if $config->{dsn} =~ /^dbi:/i; return decode_json( get( "http://someserver.com/v1.0/database?key=somesecret&db=" . $config->{dsn} )); } # AUTHOR SymKat __ # COPYRIGHT AND LICENSE This is free software licensed under a _BSD-Style_ License. Please see the LICENSE file included in this package for more detailed information. # AVAILABILITY The latest version of this software is available through GitHub at https://github.com/symkat/DBIx-Class-Schema-Config