[Bps-public-commit] dbix-searchbuilder branch driver-mariadb created. 1.79-4-gf316709
BPS Git Server
git at git.bestpractical.com
Fri Jan 5 22:06:13 UTC 2024
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "dbix-searchbuilder".
The branch, driver-mariadb has been created
at f31670918dce989dc535fdeff7a9177ba0370493 (commit)
- Log -----------------------------------------------------------------
commit f31670918dce989dc535fdeff7a9177ba0370493
Author: Jim Brandt <jbrandt at bestpractical.com>
Date: Fri Jan 5 17:03:38 2024 -0500
Add explicit support for MariaDB in addition to MySQL
Starting with version 5.001, DBD::mysql will no longer support
MariaDB. Add explicit support in DBIx::SearchBuilder for
MariaDB and DBD::MariaDB independent of mysql and DBD::mysql.
diff --git a/lib/DBIx/SearchBuilder/Handle/MariaDB.pm b/lib/DBIx/SearchBuilder/Handle/MariaDB.pm
new file mode 100755
index 0000000..fcba526
--- /dev/null
+++ b/lib/DBIx/SearchBuilder/Handle/MariaDB.pm
@@ -0,0 +1,376 @@
+package DBIx::SearchBuilder::Handle::MariaDB;
+
+use strict;
+use warnings;
+use version;
+
+use base qw(DBIx::SearchBuilder::Handle);
+
+=head1 NAME
+
+ DBIx::SearchBuilder::Handle::MariaDB - A MariaDB specific Handle object
+
+=head1 SYNOPSIS
+
+
+=head1 DESCRIPTION
+
+This module provides a subclass of DBIx::SearchBuilder::Handle that
+compensates for some of the idiosyncrasies of MySQL.
+
+=head1 METHODS
+
+=head2 Insert
+
+Takes a table name as the first argument and assumes that the rest of the arguments are an array of key-value pairs to be inserted.
+
+If the insert succeeds, returns the id of the insert, otherwise, returns
+a Class::ReturnValue object with the error reported.
+
+=cut
+
+sub Insert {
+ my $self = shift;
+
+ my $sth = $self->SUPER::Insert(@_);
+ if (!$sth) {
+ return ($sth);
+ }
+
+ # Follow the advice in the docs and use last_insert_id rather than
+ # {'mariadb_insertid'}.
+ #
+ # https://metacpan.org/dist/DBD-MariaDB/view/lib/DBD/MariaDB.pod#mariadb_insertid
+
+ $self->{'id'}=$self->dbh->last_insert_id();
+
+ # Docs say last_insert_id could still return undef, so keeping this code
+ unless ($self->{'id'}) {
+ $self->{'id'} = $self->FetchResult('SELECT LAST_INSERT_ID()');
+ }
+ warn "$self no row id returned on row creation" unless ($self->{'id'});
+
+ return( $self->{'id'}); #Add Succeded. return the id
+}
+
+=head2 SimpleUpdateFromSelect
+
+Customization of L<DBIx::SearchBuilder::Handle/SimpleUpdateFromSelect>.
+Mysql doesn't support update with subqueries when those fetch data from
+the table that is updated.
+
+=cut
+
+sub SimpleUpdateFromSelect {
+ my ($self, $table, $values, $query, @query_binds) = @_;
+
+ return $self->SUPER::SimpleUpdateFromSelect(
+ $table, $values, $query, @query_binds
+ ) unless $query =~ /\b\Q$table\E\b/i;
+
+ my $sth = $self->SimpleQuery( $query, @query_binds );
+ return $sth unless $sth;
+
+ my (@binds, @columns);
+ for my $k (sort keys %$values) {
+ push @columns, $k;
+ push @binds, $values->{$k};
+ }
+
+ $table = $self->QuoteName($table) if $self->{'QuoteTableNames'};
+ my $update_query = "UPDATE $table SET "
+ . join( ', ', map "$_ = ?", @columns )
+ .' WHERE ID IN ';
+
+ return $self->SimpleMassChangeFromSelect(
+ $update_query, \@binds,
+ $query, @query_binds
+ );
+}
+
+
+sub DeleteFromSelect {
+ my ($self, $table, $query, @query_binds) = @_;
+
+ return $self->SUPER::DeleteFromSelect(
+ $table, $query, @query_binds
+ ) unless $query =~ /\b\Q$table\E\b/i;
+
+ $table = $self->QuoteName($table) if $self->{'QuoteTableNames'};
+ return $self->SimpleMassChangeFromSelect(
+ "DELETE FROM $table WHERE id IN ", [],
+ $query, @query_binds
+ );
+}
+
+sub SimpleMassChangeFromSelect {
+ my ($self, $update_query, $update_binds, $search, @search_binds) = @_;
+
+ my $sth = $self->SimpleQuery( $search, @search_binds );
+ return $sth unless $sth;
+
+
+ # tried TEMPORARY tables, much slower than fetching and delete
+ # also size of ENGINE=MEMORY is limitted by option, on disk
+ # tables more slower than in memory
+ my $res = 0;
+
+ my @ids;
+ while ( my $id = ($sth->fetchrow_array)[0] ) {
+ push @ids, $id;
+ next if @ids < 1000;
+
+ my $q = $update_query .'('. join( ',', ('?')x at ids ) .')';
+ my $sth = $self->SimpleQuery( $q, @$update_binds, splice @ids );
+ return $sth unless $sth;
+
+ $res += $sth->rows;
+ }
+ if ( @ids ) {
+ my $q = $update_query .'('. join( ',', ('?')x at ids ) .')';
+ my $sth = $self->SimpleQuery( $q, @$update_binds, splice @ids );
+ return $sth unless $sth;
+
+ $res += $sth->rows;
+ }
+ return $res == 0? '0E0': $res;
+}
+
+=head2 DatabaseVersion
+
+Returns the MariaDB version, trimming off any -foo identifier
+
+=cut
+
+sub DatabaseVersion {
+ my $self = shift;
+ my $v = $self->SUPER::DatabaseVersion();
+
+ $v =~ s/\-.*$//;
+ return ($v);
+}
+
+=head2 CaseSensitive
+
+Returns undef, since MariaDB's searches are not case sensitive by default
+
+=cut
+
+sub CaseSensitive {
+ my $self = shift;
+ return(undef);
+}
+
+sub DistinctQuery {
+ my $self = shift;
+ my $statementref = shift;
+ my $sb = shift;
+
+ return $self->SUPER::DistinctQuery( $statementref, $sb, @_ )
+ if $sb->_OrderClause !~ /(?<!main)\./;
+
+ if ( substr($self->DatabaseVersion, 0, 1) == 4 ) {
+ local $sb->{'group_by'} = [{FIELD => 'id'}];
+
+ my ($idx, @tmp, @specials) = (0, ());
+ foreach ( @{$sb->{'order_by'}} ) {
+ if ( !exists $_->{'ALIAS'} || ($_->{'ALIAS'}||'') eq "main" ) {
+ push @tmp, $_; next;
+ }
+
+ push @specials,
+ ((($_->{'ORDER'}||'') =~ /^des/i)?'MAX':'MIN')
+ ."(". $_->{'ALIAS'} .".". $_->{'FIELD'} .")"
+ ." __special_sort_$idx";
+ push @tmp, { ALIAS => '', FIELD => "__special_sort_$idx", ORDER => $_->{'ORDER'} };
+ $idx++;
+ }
+
+ local $sb->{'order_by'} = \@tmp;
+ $$statementref = "SELECT ". join( ", ", 'main.*', @specials ) ." FROM $$statementref";
+ $$statementref .= $sb->_GroupClause;
+ $$statementref .= $sb->_OrderClause;
+ } else {
+ local $sb->{'group_by'} = [{FIELD => 'id'}];
+ local $sb->{'order_by'} = [
+ map {
+ ($_->{'ALIAS'}||'') ne "main"
+ ? { %{$_}, FIELD => ((($_->{'ORDER'}||'') =~ /^des/i)?'MAX':'MIN') ."(".$_->{FIELD}.")" }
+ : $_
+ }
+ @{$sb->{'order_by'}}
+ ];
+ $$statementref = "SELECT main.* FROM $$statementref";
+ $$statementref .= $sb->_GroupClause;
+ $$statementref .= $sb->_OrderClause;
+ }
+}
+
+sub Fields {
+ my $self = shift;
+ my $table = shift;
+
+ my $cache = \%DBIx::SearchBuilder::Handle::FIELDS_IN_TABLE;
+ unless ( $cache->{ lc $table } ) {
+ my $sth = $self->dbh->column_info( undef, undef, $table, '%' )
+ or return ();
+ my $info = $sth->fetchall_arrayref({});
+ foreach my $e ( sort {$a->{'ORDINAL_POSITION'} <=> $b->{'ORDINAL_POSITION'}} @$info ) {
+ push @{ $cache->{ lc $e->{'TABLE_NAME'} } ||= [] }, lc $e->{'COLUMN_NAME'};
+ }
+ }
+ return @{ $cache->{ lc $table } || [] };
+}
+
+=head2 SimpleDateTimeFunctions
+
+Returns hash reference with specific date time functions of this
+database for L<DBIx::SearchBuilder::Handle/DateTimeFunction>.
+
+=cut
+
+sub SimpleDateTimeFunctions {
+ my $self = shift;
+ return $self->{'_simple_date_time_functions'} ||= {
+ %{ $self->SUPER::SimpleDateTimeFunctions(@_) },
+ datetime => '?',
+ time => 'TIME(?)',
+
+ hourly => "DATE_FORMAT(?, '%Y-%m-%d %H')",
+ hour => 'HOUR(?)',
+
+ date => 'DATE(?)',
+ daily => 'DATE(?)',
+
+ day => 'DAYOFMONTH(?)',
+ dayofmonth => 'DAYOFMONTH(?)',
+
+ monthly => "DATE_FORMAT(?, '%Y-%m')",
+ month => 'MONTH(?)',
+
+ annually => 'YEAR(?)',
+ year => 'YEAR(?)',
+
+ dayofweek => "DAYOFWEEK(?) - 1", # 1-7, 1 - Sunday
+ dayofyear => "DAYOFYEAR(?)", # 1-366
+ weekofyear => "WEEK(?)", # skip mode argument, so it can be controlled in MariaDB config
+ };
+}
+
+
+=head2 ConvertTimezoneFunction
+
+Custom implementation of L<DBIx::SearchBuilder::Handle/ConvertTimezoneFunction>.
+
+Use the following query to get list of timezones:
+
+ SELECT Name FROM mysql.time_zone_name;
+
+See also details on how MariaDB works with mysql timezone tables
+
+ https://mariadb.com/kb/en/time-zones/
+
+=cut
+
+sub ConvertTimezoneFunction {
+ my $self = shift;
+ my %args = (
+ From => 'UTC',
+ To => undef,
+ Field => '',
+ @_
+ );
+ return $args{'Field'} unless $args{From} && $args{'To'};
+ return $args{'Field'} if lc $args{From} eq lc $args{'To'};
+ my $dbh = $self->dbh;
+ $_ = $dbh->quote( $_ ) foreach @args{'From', 'To'};
+ return "CONVERT_TZ( $args{'Field'}, $args{'From'}, $args{'To'} )";
+}
+
+sub _DateTimeIntervalFunction {
+ my $self = shift;
+ my %args = ( From => undef, To => undef, @_ );
+
+ return "TIMESTAMPDIFF(SECOND, $args{'From'}, $args{'To'})";
+}
+
+
+=head2 QuoteName
+
+Quote table or column name to avoid reserved word errors.
+
+=cut
+
+# over-rides inherited method
+sub QuoteName {
+ my ($self, $name) = @_;
+ # use dbi built in quoting if we have a connection,
+ if ($self->dbh) {
+ return $self->SUPER::QuoteName($name);
+ }
+
+ return sprintf('`%s`', $name);
+}
+
+sub DequoteName {
+ my ($self, $name) = @_;
+
+ # If we have a handle, the base class can do it for us
+ if ($self->dbh) {
+ return $self->SUPER::DequoteName($name);
+ }
+
+ if ($name =~ /^`(.*)`$/) {
+ return $1;
+ }
+ return $name;
+}
+
+sub _ExtractBindValues {
+ my $self = shift;
+ my $value = shift;
+ return $self->SUPER::_ExtractBindValues( $value, '\\' );
+}
+
+sub _IsMariaDB {
+ my $self = shift;
+
+ # We override DatabaseVersion to chop off "-MariaDB-whatever", so
+ # call super here to get the original version
+ my $v = $self->SUPER::DatabaseVersion();
+
+ return ($v =~ /mariadb/i);
+}
+
+sub _RequireQuotedTables {
+ my $self = shift;
+
+ # MariaDB version does not match mysql, and hasn't added new reserved words
+ # like "groups".
+ return 0;
+}
+
+=head2 HasSupportForCombineSearchAndCount
+
+MariaDB 10.2+ supports this.
+
+=cut
+
+sub HasSupportForCombineSearchAndCount {
+ my $self = shift;
+ my ($version) = $self->DatabaseVersion =~ /^(\d+\.\d+)/;
+
+ return (version->parse('v'.$version) >= version->parse('v10.2')) ? 1 : 0;
+}
+
+sub CastAsDecimal {
+ my $self = shift;
+ my $field = shift or return;
+
+ # CAST($field AS DECIMAL) rounds values to integers by default. It supports
+ # specific precisions like CAST($field AS DECIMAL(5,2)), but we don't know
+ # the precisions in advance. +0 works like other dbs.
+ return "($field+0)";
+}
+
+1;
diff --git a/t/00.load.t b/t/00.load.t
index cfc6dcb..c03ba27 100644
--- a/t/00.load.t
+++ b/t/00.load.t
@@ -1,4 +1,4 @@
-use Test::More tests => 12;
+use Test::More tests => 13;
BEGIN { use_ok("DBIx::SearchBuilder"); }
BEGIN { use_ok("DBIx::SearchBuilder::Handle"); }
@@ -19,4 +19,4 @@ BEGIN { use_ok("DBIx::SearchBuilder::Handle::Sybase"); }
BEGIN { use_ok("DBIx::SearchBuilder::Handle::SQLite"); }
BEGIN { use_ok("DBIx::SearchBuilder::Record"); }
BEGIN { use_ok("DBIx::SearchBuilder::Record::Cachable"); }
-
+BEGIN { use_ok("DBIx::SearchBuilder::Handle::MariaDB"); }
diff --git a/t/01records.t b/t/01records.t
index dd143ca..c175267 100644
--- a/t/01records.t
+++ b/t/01records.t
@@ -270,6 +270,18 @@ EOF
}
+sub schema_mariadb {
+<<EOF;
+CREATE TEMPORARY TABLE Address (
+ id integer AUTO_INCREMENT,
+ Name varchar(36),
+ Phone varchar(18),
+ EmployeeId int(8),
+ PRIMARY KEY (id)) CHARACTER SET utf8mb4
+EOF
+
+}
+
sub schema_pg {
<<EOF;
CREATE TEMPORARY TABLE Address (
diff --git a/t/01searches.t b/t/01searches.t
index 3320061..a7addbe 100644
--- a/t/01searches.t
+++ b/t/01searches.t
@@ -479,6 +479,21 @@ sub cleanup_schema_mysql { [
"DROP TABLE Users",
] }
+sub schema_mariadb {[
+ "DROP TABLE IF EXISTS Users",
+<<EOF
+CREATE TABLE Users (
+ id integer AUTO_INCREMENT,
+ Login varchar(18) NOT NULL,
+ Name varchar(36),
+ Phone varchar(18),
+ PRIMARY KEY (id))
+EOF
+]}
+sub cleanup_schema_mariadb { [
+ "DROP TABLE Users",
+] }
+
sub schema_pg {
<<EOF;
CREATE TEMPORARY TABLE Users (
diff --git a/t/02distinct_values.t b/t/02distinct_values.t
index 826db21..59d0d85 100644
--- a/t/02distinct_values.t
+++ b/t/02distinct_values.t
@@ -88,6 +88,17 @@ EOF
}
+sub schema_mariadb {
+<<EOF;
+CREATE TEMPORARY TABLE Users (
+ id integer AUTO_INCREMENT,
+ Login varchar(18) NOT NULL,
+ GroupName varchar(36),
+ PRIMARY KEY (id))
+EOF
+
+}
+
sub schema_pg {
<<EOF;
CREATE TEMPORARY TABLE Users (
diff --git a/t/02null_order.t b/t/02null_order.t
index fab111d..6bdea9e 100644
--- a/t/02null_order.t
+++ b/t/02null_order.t
@@ -110,6 +110,20 @@ sub cleanup_schema_mysql { [
"DROP TABLE Users",
] }
+sub schema_mariadb {[
+ "DROP TABLE IF EXISTS Users",
+<<EOF
+CREATE TABLE Users (
+ id integer AUTO_INCREMENT,
+ Value integer,
+ PRIMARY KEY (id)
+)
+EOF
+]}
+sub cleanup_schema_mariadb { [
+ "DROP TABLE Users",
+] }
+
sub schema_pg {
<<EOF;
CREATE TEMPORARY TABLE Users (
diff --git a/t/02order.t b/t/02order.t
index e1eff21..677d8eb 100644
--- a/t/02order.t
+++ b/t/02order.t
@@ -57,7 +57,7 @@ diag "generate data" if $ENV{TEST_VERBOSE};
my @fields = (
'Name',
- $d eq 'Oracle' ? 'TO_CHAR(Name)' : $d eq 'mysql' ? 'BINARY(Name)' : 'CAST(Name AS TEXT)'
+ $d eq 'Oracle' ? 'TO_CHAR(Name)' : ($d eq 'mysql' || $d eq 'MariaDB') ? 'BINARY(Name)' : 'CAST(Name AS TEXT)'
);
diag "test ordering objects by fields on Tags table" if $ENV{TEST_VERBOSE};
@@ -172,6 +172,21 @@ sub schema_mysql { [
"CREATE INDEX Tags1 ON Tags (Name)"
] }
+sub schema_mariadb { [
+ "CREATE TEMPORARY TABLE Objects (
+ id integer AUTO_INCREMENT,
+ Name varchar(36),
+ PRIMARY KEY (id)
+ )",
+ "CREATE TEMPORARY TABLE Tags (
+ id integer AUTO_INCREMENT,
+ Object integer NOT NULL,
+ Name varchar(36),
+ PRIMARY KEY (id)
+ )",
+ "CREATE INDEX Tags1 ON Tags (Name)"
+] }
+
sub schema_pg { [
"CREATE TEMPORARY TABLE Objects (
id serial PRIMARY KEY,
diff --git a/t/02records_cachable.t b/t/02records_cachable.t
index 9418990..69546a1 100644
--- a/t/02records_cachable.t
+++ b/t/02records_cachable.t
@@ -106,6 +106,18 @@ EOF
}
+sub schema_mariadb {
+<<EOF;
+CREATE TEMPORARY TABLE Address (
+ id integer AUTO_INCREMENT,
+ Name varchar(36),
+ Phone varchar(18),
+ EmployeeId int(8),
+ PRIMARY KEY (id))
+EOF
+
+}
+
sub schema_pg {
<<EOF;
CREATE TEMPORARY TABLE Address (
diff --git a/t/02records_datetime.t b/t/02records_datetime.t
index 6882729..ddbae31 100644
--- a/t/02records_datetime.t
+++ b/t/02records_datetime.t
@@ -49,7 +49,7 @@ SKIP: {
my ($got) = $handle->dbh->selectrow_array("SELECT datetime(?,'localtime')", undef, $check);
$skip_tz_tests = 1 if $got eq $check;
}
- elsif ($d eq 'mysql') {
+ elsif ( $d eq 'mysql' || $d eq 'MariaDB' ) {
my $check = '2013-04-01 16:00:00';
my ($got) = $handle->dbh->selectrow_array(
"SELECT CONVERT_TZ(?, ?, ?)", undef, $check, 'UTC', 'Europe/Moscow'
@@ -289,6 +289,17 @@ EOF
}
+sub schema_mariadb {
+<<EOF;
+CREATE TEMPORARY TABLE Users (
+ id integer AUTO_INCREMENT,
+ Expires DATETIME NULL,
+ PRIMARY KEY (id)
+)
+EOF
+
+}
+
sub schema_pg {
<<EOF;
CREATE TEMPORARY TABLE Users (
diff --git a/t/02records_dt_interval.t b/t/02records_dt_interval.t
index fa5abbf..f08ea50 100644
--- a/t/02records_dt_interval.t
+++ b/t/02records_dt_interval.t
@@ -94,6 +94,19 @@ EOF
}
+sub schema_mariadb {
+<<EOF;
+CREATE TEMPORARY TABLE Users (
+ id integer AUTO_INCREMENT,
+ Created DATETIME NULL,
+ Resolved DATETIME NULL,
+ Result integer NULL,
+ PRIMARY KEY (id)
+)
+EOF
+
+}
+
sub schema_pg {
<<EOF;
CREATE TEMPORARY TABLE Users (
diff --git a/t/02records_integers.t b/t/02records_integers.t
index 95b8504..5ec2382 100644
--- a/t/02records_integers.t
+++ b/t/02records_integers.t
@@ -148,6 +148,17 @@ EOF
}
+sub schema_mariadb {
+<<EOF;
+CREATE TEMPORARY TABLE MyTable (
+ id integer PRIMARY KEY AUTO_INCREMENT,
+ Optional integer NULL,
+ Mandatory integer NOT NULL DEFAULT 1
+)
+EOF
+
+}
+
sub schema_pg {
<<EOF;
CREATE TEMPORARY TABLE MyTable (
diff --git a/t/02records_object.t b/t/02records_object.t
index 34576db..4799fe8 100644
--- a/t/02records_object.t
+++ b/t/02records_object.t
@@ -88,6 +88,21 @@ CREATE TEMPORARY TABLE Phones (
} ]
}
+sub schema_mariadb {
+[ q{
+CREATE TEMPORARY TABLE Employees (
+ id integer AUTO_INCREMENT primary key,
+ Name varchar(36)
+)
+}, q{
+CREATE TEMPORARY TABLE Phones (
+ id integer AUTO_INCREMENT primary key,
+ Employee integer NOT NULL,
+ Phone varchar(18)
+)
+} ]
+}
+
sub schema_pg {
[ q{
CREATE TEMPORARY TABLE Employees (
diff --git a/t/02searches_function.t b/t/02searches_function.t
index e9a25a9..94f5d4c 100644
--- a/t/02searches_function.t
+++ b/t/02searches_function.t
@@ -190,6 +190,28 @@ CREATE TEMPORARY TABLE `Groups` (
]
}
+sub schema_mariadb {
+[
+q{
+CREATE TEMPORARY TABLE Users (
+ id integer primary key AUTO_INCREMENT,
+ Login varchar(36),
+ DeptNumber varchar(36)
+) },
+q{
+CREATE TEMPORARY TABLE UsersToGroups (
+ id integer primary key AUTO_INCREMENT,
+ UserId integer,
+ GroupId integer
+) },
+q{
+CREATE TEMPORARY TABLE `Groups` (
+ id integer primary key AUTO_INCREMENT,
+ Name varchar(36)
+) },
+]
+}
+
sub schema_pg {
[
q{
diff --git a/t/02searches_joins.t b/t/02searches_joins.t
index cbec237..64b86cc 100644
--- a/t/02searches_joins.t
+++ b/t/02searches_joins.t
@@ -343,6 +343,27 @@ CREATE TEMPORARY TABLE `Groups` (
]
}
+sub schema_mariadb {
+[
+q{
+CREATE TEMPORARY TABLE Users (
+ id integer primary key AUTO_INCREMENT,
+ Login varchar(36)
+) },
+q{
+CREATE TEMPORARY TABLE UsersToGroups (
+ id integer primary key AUTO_INCREMENT,
+ UserId integer,
+ GroupId integer
+) },
+q{
+CREATE TEMPORARY TABLE `Groups` (
+ id integer primary key AUTO_INCREMENT,
+ Name varchar(36)
+) },
+]
+}
+
sub schema_pg {
[
q{
diff --git a/t/03cud_from_select.t b/t/03cud_from_select.t
index 9f1aed4..aa2b6d9 100644
--- a/t/03cud_from_select.t
+++ b/t/03cud_from_select.t
@@ -184,6 +184,33 @@ sub cleanup_schema_mysql { [
"DROP TABLE UsersToGroups",
] }
+# TEMPORARY tables can not be referenced more than once
+# in the same query, use real table for UsersToGroups
+sub schema_mariadb {
+[
+q{
+CREATE TEMPORARY TABLE Users (
+ id integer primary key AUTO_INCREMENT,
+ Login varchar(36)
+) },
+q{
+CREATE TABLE UsersToGroups (
+ id integer primary key AUTO_INCREMENT,
+ UserId integer,
+ GroupId integer
+) },
+q{
+CREATE TEMPORARY TABLE `Groups` (
+ id integer primary key AUTO_INCREMENT,
+ Name varchar(36)
+) },
+]
+}
+
+sub cleanup_schema_mariadb { [
+ "DROP TABLE UsersToGroups",
+] }
+
sub schema_pg {
[
q{
diff --git a/t/03searches_bind.t b/t/03searches_bind.t
index 30d4739..05de4e6 100644
--- a/t/03searches_bind.t
+++ b/t/03searches_bind.t
@@ -189,6 +189,26 @@ CREATE TEMPORARY TABLE `Groups` (
]
}
+sub schema_mariadb {
+ [ q{
+CREATE TEMPORARY TABLE Users (
+ id integer primary key AUTO_INCREMENT,
+ Login varchar(36)
+) },
+ q{
+CREATE TEMPORARY TABLE UsersToGroups (
+ id integer primary key AUTO_INCREMENT,
+ UserId integer,
+ GroupId integer
+) },
+ q{
+CREATE TEMPORARY TABLE `Groups` (
+ id integer primary key AUTO_INCREMENT,
+ Name varchar(36)
+) },
+ ]
+}
+
sub schema_pg {
[ q{
CREATE TEMPORARY TABLE Users (
diff --git a/t/03searches_combine.t b/t/03searches_combine.t
index 3b28c5d..8250abe 100644
--- a/t/03searches_combine.t
+++ b/t/03searches_combine.t
@@ -141,6 +141,26 @@ CREATE TEMPORARY TABLE `Groups` (
]
}
+sub schema_mariadb {
+ [ q{
+CREATE TEMPORARY TABLE Users (
+ id integer primary key AUTO_INCREMENT,
+ Login varchar(36)
+) },
+ q{
+CREATE TEMPORARY TABLE UsersToGroups (
+ id integer primary key AUTO_INCREMENT,
+ UserId integer,
+ GroupId integer
+) },
+ q{
+CREATE TEMPORARY TABLE `Groups` (
+ id integer primary key AUTO_INCREMENT,
+ Name varchar(36)
+) },
+ ]
+}
+
sub schema_pg {
[ q{
CREATE TEMPORARY TABLE Users (
diff --git a/t/03transactions.t b/t/03transactions.t
index ef0f973..fe68a9f 100644
--- a/t/03transactions.t
+++ b/t/03transactions.t
@@ -170,6 +170,18 @@ EOF
}
+sub schema_mariadb {
+<<EOF;
+CREATE TEMPORARY TABLE Address (
+ id integer AUTO_INCREMENT,
+ Name varchar(36),
+ Phone varchar(18),
+ EmployeeId int(8),
+ PRIMARY KEY (id)) ENGINE='InnoDB'
+EOF
+
+}
+
sub schema_pg {
<<EOF;
CREATE TEMPORARY TABLE Address (
diff --git a/t/11schema_records.t b/t/11schema_records.t
index 313f127..5d83a78 100644
--- a/t/11schema_records.t
+++ b/t/11schema_records.t
@@ -235,6 +235,26 @@ q{CREATE TEMPORARY TABLE `Groups` (
]
}
+sub schema_mariadb {
+[ q{
+CREATE TEMPORARY TABLE Employees (
+ id integer AUTO_INCREMENT primary key,
+ Name varchar(36)
+)
+}, q{
+CREATE TEMPORARY TABLE Phones (
+ id integer AUTO_INCREMENT primary key,
+ Employee integer NOT NULL,
+ Phone varchar(18)
+)
+},
+q{CREATE TEMPORARY TABLE `Groups` (
+ id integer AUTO_INCREMENT primary key,
+ Name varchar(36)
+) }
+]
+}
+
sub schema_pg {
[ q{
CREATE TEMPORARY TABLE Employees (
diff --git a/t/20set_edge_cases.t b/t/20set_edge_cases.t
index d22b1ee..ee0651e 100644
--- a/t/20set_edge_cases.t
+++ b/t/20set_edge_cases.t
@@ -104,6 +104,17 @@ EOF
}
+sub schema_mariadb {
+ <<EOF;
+CREATE TEMPORARY TABLE Address (
+ id integer AUTO_INCREMENT,
+ Name varchar(36) NOT NULL,
+ Counter int(8) NOT NULL,
+ PRIMARY KEY (id))
+EOF
+
+}
+
sub schema_pg {
<<EOF;
CREATE TEMPORARY TABLE Address (
diff --git a/t/utils.pl b/t/utils.pl
index e21e3f9..fc1a9bf 100644
--- a/t/utils.pl
+++ b/t/utils.pl
@@ -12,14 +12,15 @@ Array of all supported DBD drivers.
=cut
our @SupportedDrivers = qw(
- Informix
- mysql
- mysqlPP
- ODBC
- Oracle
- Pg
- SQLite
- Sybase
+ Informix
+ MariaDB
+ mysql
+ mysqlPP
+ ODBC
+ Oracle
+ Pg
+ SQLite
+ Sybase
);
=head2 @AvailableDrivers
@@ -117,6 +118,19 @@ sub connect_mysql
);
}
+sub connect_mariadb
+{
+ my $handle = shift;
+ return $handle->Connect(
+ Driver => 'MariaDB',
+ Database => $ENV{'SB_TEST_MARIADB'},
+ Host => $ENV{'SB_TEST_MARIADB_HOST'},
+ Port => $ENV{'SB_TEST_MARIADB_PORT'},
+ User => $ENV{'SB_TEST_MARIADB_USER'} || 'root',
+ Password => $ENV{'SB_TEST_MARIADB_PASS'} || '',
+ );
+}
+
sub connect_pg
{
my $handle = shift;
-----------------------------------------------------------------------
hooks/post-receive
--
dbix-searchbuilder
More information about the Bps-public-commit
mailing list