DBD-MariaDB
view release on metacpan or search on metacpan
#else
mariadb_dr_do_error(dbh, CR_UNKNOWN_ERROR, "Fetching mariadb_max_allowed_packet is not supported", "HY000");
return Nullsv;
#endif
#else
/* before MySQL 5.7.9 and MariaDB 10.2.6 and MariaDB 10.3.0 use max_allowed_packet macro */
packet_size = max_allowed_packet;
#endif
result = sv_2mortal(newSVuv(packet_size));
}
else if (memEQs(key, kl, "mariadb_no_autocommit_cmd"))
result = boolSV(imp_dbh->no_autocommit_cmd);
else if (memEQs(key, kl, "mariadb_protoinfo"))
result = imp_dbh->pmysql ? sv_2mortal(newSViv(mysql_get_proto_info(imp_dbh->pmysql))) : &PL_sv_undef;
else if (memEQs(key, kl, "mariadb_serverinfo"))
{
const char *serverinfo = imp_dbh->pmysql ? mysql_get_server_info(imp_dbh->pmysql) : NULL;
#ifndef MARIADB_BASE_VERSION
/* serverinfo for MariaDB server from MySQL client is prefixed by string 5.5.5- */
if (serverinfo && strBEGINs(serverinfo, "5.5.5-"))
serverinfo += sizeof("5.5.5-")-1;
#endif
result = serverinfo ? sv_2mortal(newSVpv(serverinfo, 0)) : &PL_sv_undef;
sv_utf8_decode(result);
}
else if (memEQs(key, kl, "mariadb_ssl_cipher"))
{
#if ((MYSQL_VERSION_ID >= 50023 && MYSQL_VERSION_ID < 50100) || MYSQL_VERSION_ID >= 50111)
const char *ssl_cipher = imp_dbh->pmysql ? mysql_get_ssl_cipher(imp_dbh->pmysql) : NULL;
result = ssl_cipher ? sv_2mortal(newSVpv(ssl_cipher, 0)) : &PL_sv_undef;
sv_utf8_decode(result);
#else
mariadb_dr_do_error(dbh, CR_UNKNOWN_ERROR, "Fetching mariadb_ssl_cipher is not supported", "HY000");
return Nullsv;
#endif
}
else if (memEQs(key, kl, "mariadb_serverversion"))
{
#ifndef MARIADB_BASE_VERSION
unsigned int major, minor, patch;
const char *serverinfo = imp_dbh->pmysql ? mysql_get_server_info(imp_dbh->pmysql) : NULL;
/* serverinfo for MariaDB server from MySQL client is prefixed by string 5.5.5- */
if (serverinfo && strBEGINs(serverinfo, "5.5.5-"))
{
/* And in this case mysql_get_server_version() returns just 50505 and not correct
* MariaDB server version. So parse serverversion manually from serverinfo. */
serverinfo += sizeof("5.5.5-")-1;
if (sscanf(serverinfo, "%u.%u.%u", &major, &minor, &patch) == 3)
result = sv_2mortal(newSVuv(10000UL * major + 100UL * minor + patch));
}
#endif
if (!result)
result = imp_dbh->pmysql ? sv_2mortal(newSVuv(mysql_get_server_version(imp_dbh->pmysql))) : &PL_sv_undef;
}
else if (memEQs(key, kl, "mariadb_sock"))
result = sv_2mortal(newSViv(PTR2IV(imp_dbh->pmysql)));
else if (memEQs(key, kl, "mariadb_sockfd"))
result = (imp_dbh->sock_fd >= 0) ? sv_2mortal(newSViv(imp_dbh->sock_fd)) : &PL_sv_undef;
else if (memEQs(key, kl, "mariadb_stat"))
{
const char *stats = imp_dbh->pmysql ? mysql_stat(imp_dbh->pmysql) : NULL;
result = stats ? sv_2mortal(newSVpv(stats, 0)) : &PL_sv_undef;
sv_utf8_decode(result);
}
else if (memEQs(key, kl, "mariadb_server_prepare"))
result = boolSV(imp_dbh->use_server_side_prepare);
else if (memEQs(key, kl, "mariadb_server_prepare_disable_fallback"))
result = boolSV(imp_dbh->disable_fallback_for_server_prepare);
else if (memEQs(key, kl, "mariadb_thread_id"))
result = imp_dbh->pmysql ? sv_2mortal(newSVuv(mysql_thread_id(imp_dbh->pmysql))) : &PL_sv_undef;
else if (memEQs(key, kl, "mariadb_warning_count"))
result = imp_dbh->pmysql ? sv_2mortal(newSVuv(mysql_warning_count(imp_dbh->pmysql))) : &PL_sv_undef;
else if (memEQs(key, kl, "mariadb_use_result"))
result = boolSV(imp_dbh->use_mysql_use_result);
else if (memEQs(key, kl, "mariadb_multi_statements"))
result = boolSV(imp_dbh->use_multi_statements);
else
{
error_unknown_attribute(dbh, key);
return Nullsv;
}
}
return result;
}
AV *mariadb_db_data_sources(SV *dbh, imp_dbh_t *imp_dbh, SV *attr)
{
dTHX;
SV *sv;
AV *av;
SSize_t i;
MYSQL_RES *res;
MYSQL_ROW row;
MYSQL_FIELD* field;
my_ulonglong num_rows;
unsigned long *lengths;
const char *prefix = "DBI:MariaDB:";
const Size_t prefix_len = strlen(prefix);
PERL_UNUSED_ARG(attr);
ASYNC_CHECK_RETURN(dbh, NULL);
if (!imp_dbh->pmysql && !mariadb_db_reconnect(dbh, NULL))
{
mariadb_dr_do_error(dbh, CR_SERVER_GONE_ERROR, "MySQL server has gone away", "HY000");
return NULL;
}
av = newAV();
sv_2mortal((SV *)av);
res = mysql_list_dbs(imp_dbh->pmysql, NULL);
if (!res && mariadb_db_reconnect(dbh, NULL))
res = mysql_list_dbs(imp_dbh->pmysql, NULL);
if (!res)
{
mariadb_dr_do_error(dbh, mysql_errno(imp_dbh->pmysql),
mysql_error(imp_dbh->pmysql),
mysql_sqlstate(imp_dbh->pmysql));
return NULL;
( run in 0.879 second using v1.01-cache-2.11-cpan-39bf76dae61 )