+our $database;
+
+=head2 new
+
+ $schema = Koha::Database->new->schema;
+
+ FIXME: It is useless to have a Koha::Database object since all methods
+ below act as class methods
+ Koha::Database->new->schema is exactly the same as Koha::Database->schema
+ We should use Koha::Database->schema everywhere and remove the `new` method
+
+=cut
+
+sub new { bless {}, shift }
+
+=head2 dbh
+
+ Returns a database handler without loading the DBIx::Class schema.
+
+=cut
+
+sub dbh {
+ my $config = Koha::Config->get_instance;
+ my $driver = db_scheme2dbi($config->get('db_scheme'));
+ my $user = $config->get("user"),
+ my $pass = $config->get("pass"),
+ my $dsn = sprintf(
+ 'dbi:%s:database=%s;host=%s;port=%s',
+ $driver,
+ $config->get("database_test") || $config->get("database"),
+ $config->get("hostname"),
+ $config->get("port") || '',
+ );
+
+ my $attr = {
+ RaiseError => 1,
+ PrintError => 1,
+ };
+
+ if ($driver eq 'mysql') {
+ my $tls = $config->get("tls");
+ if ($tls && $tls eq 'yes') {
+ $dsn .= sprintf(
+ ';mysql_ssl=1;mysql_ssl_client_key=%s;mysql_ssl_client_cert=%s;mysql_ssl_ca_file=%s',
+ $config->get('key'),
+ $config->get('cert'),
+ $config->get('ca'),
+ );
+ }
+
+ $attr->{mysql_enable_utf8} = 1;
+ }
+
+ my $dbh = DBI->connect($dsn, $user, $pass, $attr);
+
+ if ($dbh) {
+ my @queries;
+ my $tz = $config->timezone;
+ $tz = '' if $tz eq 'local';
+
+ if ($driver eq 'mysql') {
+ push @queries, "SET NAMES 'utf8mb4'";
+ push @queries, qq{SET time_zone = "$tz"} if $tz;
+ if ( $config->get('strict_sql_modes')
+ || ( exists $ENV{_} && $ENV{_} =~ m|prove| )
+ || $ENV{KOHA_TESTING}
+ ) {
+ push @queries, q{
+ SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
+ };
+ } else {
+ push @queries, q{SET sql_mode = 'IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'}
+ }
+ } elsif ($driver eq 'Pg') {
+ push @queries, qq{SET TIME ZONE = "$tz"} if $tz;
+ push @queries, q{set client_encoding = 'UTF8'};
+ }
+
+ foreach my $query (@queries) {
+ $dbh->do($query);
+ }
+ }
+
+ return $dbh;
+}