/* Hej, Emacs, this is -*- C -*- mode!
Copyright (c) 2018 GoodData Corporation
Copyright (c) 2015-2022 Pali Rohár
Copyright (c) 2004-2017 Patrick Galbraith
Copyright (c) 2013-2017 Michiel Beijen
Copyright (c) 2004-2007 Alexey Stroganov
Copyright (c) 2003-2005 Rudolf Lippan
Copyright (c) 1997-2003 Jochen Wiedmann
You may distribute under the terms of either the GNU General Public
License or the Artistic License, as specified in the Perl README file.
*/
#include "dbdimp.h"
#define ASYNC_CHECK_XS(h)\
if(imp_dbh->async_query_in_flight) {\
mariadb_dr_do_error(h, CR_UNKNOWN_ERROR, "Calling a synchronous function on an asynchronous handle", "HY000");\
XSRETURN_UNDEF;\
}
DBISTATE_DECLARE;
MODULE = DBD::MariaDB PACKAGE = DBD::MariaDB
INCLUDE: MariaDB.xsi
MODULE = DBD::MariaDB PACKAGE = DBD::MariaDB
BOOT:
{
HV *stash = gv_stashpvs("DBD::MariaDB", GV_ADD);
#define newTypeSub(stash, type) newCONSTSUB((stash), #type + sizeof("MYSQL_")-1, newSViv(type))
newTypeSub(stash, MYSQL_TYPE_DECIMAL);
newTypeSub(stash, MYSQL_TYPE_TINY);
newTypeSub(stash, MYSQL_TYPE_SHORT);
newTypeSub(stash, MYSQL_TYPE_LONG);
newTypeSub(stash, MYSQL_TYPE_FLOAT);
newTypeSub(stash, MYSQL_TYPE_DOUBLE);
newTypeSub(stash, MYSQL_TYPE_NULL);
newTypeSub(stash, MYSQL_TYPE_TIMESTAMP);
newTypeSub(stash, MYSQL_TYPE_LONGLONG);
newTypeSub(stash, MYSQL_TYPE_INT24);
newTypeSub(stash, MYSQL_TYPE_DATE);
newTypeSub(stash, MYSQL_TYPE_TIME);
newTypeSub(stash, MYSQL_TYPE_DATETIME);
newTypeSub(stash, MYSQL_TYPE_YEAR);
newTypeSub(stash, MYSQL_TYPE_NEWDATE);
newTypeSub(stash, MYSQL_TYPE_VARCHAR);
newTypeSub(stash, MYSQL_TYPE_BIT);
newTypeSub(stash, MYSQL_TYPE_NEWDECIMAL);
newTypeSub(stash, MYSQL_TYPE_ENUM);
newTypeSub(stash, MYSQL_TYPE_SET);
newTypeSub(stash, MYSQL_TYPE_TINY_BLOB);
newTypeSub(stash, MYSQL_TYPE_MEDIUM_BLOB);
newTypeSub(stash, MYSQL_TYPE_LONG_BLOB);
newTypeSub(stash, MYSQL_TYPE_BLOB);
newTypeSub(stash, MYSQL_TYPE_VAR_STRING);
newTypeSub(stash, MYSQL_TYPE_STRING);
#undef newTypeSub
#if defined(HAVE_DEINITIALIZE_SSL) && defined(HAVE_PROBLEM_WITH_OPENSSL)
/* Do not deinitialize OpenSSL library after mysql_server_end()
* See: https://github.com/perl5-dbi/DBD-MariaDB/issues/119 */
mariadb_deinitialize_ssl = 0;
#endif
#ifndef _WIN32
/* Calling mysql_thread_init() on WIN32 cause crash */
mysql_thread_init();
#endif
}
MODULE = DBD::MariaDB PACKAGE = DBD::MariaDB::db
void
connected(dbh, ...)
SV* dbh
PPCODE:
/* Called by DBI when connect method finished */
D_imp_dbh(dbh);
imp_dbh->connected = TRUE;
XSRETURN_EMPTY;
void
type_info_all(dbh)
SV* dbh
PPCODE:
{
PERL_UNUSED_VAR(dbh);
ST(0) = sv_2mortal(newRV_noinc((SV*) mariadb_db_type_info_all()));
XSRETURN(1);
}
#ifndef HAVE_DBI_1_642
IV
do(dbh, statement, attr=Nullsv, ...)
SV *dbh
SV *statement
SV *attr
CODE:
{
/* Compatibility for DBI version prior to 1.642 which does not support dbd_db_do6 API */
D_imp_dbh(dbh);
RETVAL = mariadb_db_do6(dbh, imp_dbh, statement, attr, items-3, ax+3);
if (RETVAL == 0) /* ok with no rows affected */
XSRETURN_PV("0E0"); /* (true but zero) */
else if (RETVAL < -1) /* -1 == unknown number of rows */
XSRETURN_UNDEF;
}
OUTPUT:
RETVAL
#endif
bool
ping(dbh)
SV* dbh;
CODE:
{
D_imp_dbh(dbh);
ASYNC_CHECK_XS(dbh);
if (!imp_dbh->pmysql)
XSRETURN_NO;
RETVAL = (mysql_ping(imp_dbh->pmysql) == 0);
if (!RETVAL)
{
if (mariadb_db_reconnect(dbh, NULL))
RETVAL = (mysql_ping(imp_dbh->pmysql) == 0);
}
}
OUTPUT:
RETVAL
void
quote(dbh, str, type=NULL)
SV* dbh
SV* str
SV* type
PPCODE:
{
SV* quoted;
D_imp_dbh(dbh);
ASYNC_CHECK_XS(dbh);
quoted = mariadb_db_quote(dbh, str, type);
ST(0) = quoted ? sv_2mortal(quoted) : str;
XSRETURN(1);
}
SV *
mariadb_sockfd(dbh)
SV* dbh
CODE:
D_imp_dbh(dbh);
RETVAL = (imp_dbh->sock_fd >= 0) ? newSViv(imp_dbh->sock_fd) : &PL_sv_undef;
OUTPUT:
RETVAL
SV *
mariadb_async_result(dbh)
SV* dbh
CODE:
{
my_ulonglong retval;
retval = mariadb_db_async_result(dbh, NULL);
if (retval == 0)
XSRETURN_PV("0E0");
else if (retval == (my_ulonglong)-1)
XSRETURN_UNDEF;
else if (retval == (my_ulonglong)-2)
XSRETURN_IV(-1);
RETVAL = my_ulonglong2sv(retval);
}
OUTPUT:
RETVAL
void mariadb_async_ready(dbh)
SV* dbh
PPCODE:
{
int retval;
retval = mariadb_db_async_ready(dbh);
if(retval > 0) {
XSRETURN_YES;
} else if(retval == 0) {
XSRETURN_NO;
} else {
XSRETURN_UNDEF;
}
}
void _async_check(dbh)
SV* dbh
PPCODE:
{
D_imp_dbh(dbh);
ASYNC_CHECK_XS(dbh);
XSRETURN_YES;
}
MODULE = DBD::MariaDB PACKAGE = DBD::MariaDB::st
bool
more_results(sth)
SV * sth
CODE:
{
D_imp_sth(sth);
RETVAL = mariadb_st_more_results(sth, imp_sth);
}
OUTPUT:
RETVAL
SV *
rows(sth)
SV* sth
CODE:
D_imp_sth(sth);
D_imp_dbh_from_sth;
if(imp_dbh->async_query_in_flight) {
if (mariadb_db_async_result(sth, &imp_sth->result) == (my_ulonglong)-1) {
XSRETURN_UNDEF;
}
}
if (imp_sth->row_num == (my_ulonglong)-1 || imp_sth->row_num == (my_ulonglong)-2)
XSRETURN_IV(-1);
RETVAL = my_ulonglong2sv(imp_sth->row_num);
OUTPUT:
RETVAL
#ifndef HAVE_DBI_1_642
void
last_insert_id(sth, catalog=&PL_sv_undef, schema=&PL_sv_undef, table=&PL_sv_undef, field=&PL_sv_undef, attr=Nullsv)
SV *sth
SV *catalog
SV *schema
SV *table
SV *field
SV *attr
PPCODE:
{
/* Compatibility for DBI version prior to 1.642 which does not support dbd_st_last_insert_id API */
D_imp_sth(sth);
ST(0) = mariadb_st_last_insert_id(sth, imp_sth, catalog, schema, table, field, attr);
XSRETURN(1);
}
#endif
SV *
mariadb_async_result(sth)
SV* sth
CODE:
{
D_imp_sth(sth);
my_ulonglong retval;
retval= mariadb_db_async_result(sth, &imp_sth->result);
if (retval == (my_ulonglong)-1)
XSRETURN_UNDEF;
if (retval == (my_ulonglong)-2)
XSRETURN_IV(-1);
if (retval == 0)
XSRETURN_PV("0E0");
RETVAL = my_ulonglong2sv(retval);
}
OUTPUT:
RETVAL
void mariadb_async_ready(sth)
SV* sth
PPCODE:
{
int retval;
retval = mariadb_db_async_ready(sth);
if(retval > 0) {
XSRETURN_YES;
} else if(retval == 0) {
XSRETURN_NO;
} else {
XSRETURN_UNDEF;
}
}
void _async_check(sth)
SV* sth
PPCODE:
{
D_imp_sth(sth);
D_imp_dbh_from_sth;
ASYNC_CHECK_XS(sth);
XSRETURN_YES;
}