MariaDB-NonBlocking
view release on metacpan or search on metacpan
NonBlocking.xs view on Meta::CPAN
}
/* TODO should be called positive integer */
void
THX_mysql_opt_integer(pTHX_ MariaDB_client* maria, HV* hv, const char* str, STRLEN str_len, enum mysql_option option )
#define mysql_opt_integer(m, h, s, o) \
THX_mysql_opt_integer(aTHX_ m, h, s, sizeof(s)-1, o)
{
int value;
SV** svp = hv_fetch(hv, str, str_len, FALSE);
if ( !svp || !*svp || !SvOK(*svp) )
return;
value = SvIV(*svp);
if ( value ) /* huh... */
mysql_options(
maria->mysql,
option,
(const char*)&value
);
return;
}
void
THX_unpack_config_from_hashref(pTHX_ SV* self, HV* args)
#define unpack_config_from_hashref(a,b) THX_unpack_config_from_hashref(aTHX_ a,b)
{
SV** svp;
dMARIA;
sql_config *config = maria->config;
/*
With this code:
$maria->connect({user => "foo"});
$maria->disconnect;
$maria->connect({user => "bar"});
If we don't clear config items, we could end up
with a mix of both configs. And if we don't free
them, we leak memory.
*/
free_our_config_items(config);
config->hostname = savepv(easy_arg_fetch(args, "host", TRUE));
config->username = savepv(easy_arg_fetch(args, "user", TRUE));
config->database = savepv(easy_arg_fetch(args, "database", FALSE));
config->unix_socket = savepv(easy_arg_fetch(args, "unix_socket", FALSE));
config->charset_name = savepv(easy_arg_fetch(args, "charset", FALSE));
#define FETCH_FROM_HV(s) \
((svp = hv_fetch(args, s, sizeof(s)-1, FALSE)) && *svp && SvOK(*svp))
config->port = FETCH_FROM_HV("port") ? SvIV(*svp) : 0;
maria->store_query_result = FETCH_FROM_HV("mysql_use_results")
? cBOOL(SvTRUE(*svp) ? FALSE : TRUE)
: TRUE;
/* TODO: DBD::mysql compat mysql_enable_utf8 / mysql_enable_utf8mb4 */
if ( config->charset_name && strlen(config->charset_name) )
mysql_options(
maria->mysql,
MYSQL_SET_CHARSET_NAME,
config->charset_name
);
if ( config->unix_socket && strlen(config->unix_socket) ) {
const int xxx = MYSQL_PROTOCOL_SOCKET;
mysql_options(
maria->mysql,
MYSQL_OPT_PROTOCOL,
&xxx
);
}
/* Going to follow DBD::mysql's naming scheme for these */
if ( FETCH_FROM_HV("mysql_init_command") && SvTRUE(*svp) ) {
const char* init_command = SvPV_nolen_const(*svp);
mysql_options(
maria->mysql,
MYSQL_INIT_COMMAND,
init_command
);
}
if ( FETCH_FROM_HV("mysql_compression") ) {
mysql_options(
maria->mysql,
MYSQL_OPT_COMPRESS,
NULL /* unused */
);
}
#define my_mysql_opt_integer(a,b) mysql_opt_integer(maria, args, a, b)
my_mysql_opt_integer("mysql_connect_timeout", MYSQL_OPT_CONNECT_TIMEOUT);
my_mysql_opt_integer("mysql_write_timeout", MYSQL_OPT_WRITE_TIMEOUT);
my_mysql_opt_integer("mysql_read_timeout", MYSQL_OPT_READ_TIMEOUT);
#undef my_mysql_opt_integer
if ( FETCH_FROM_HV("ssl") ) {
my_bool ssl_verify = 0;
my_bool ssl_enforce = 1;
bool use_default_ciphers = TRUE;
HV *ssl;
if ( !SvROK(*svp) || SvTYPE(SvRV(*svp)) != SVt_PVHV ) {
/* TODO != SVt_PVHV? Do you even magic?? */
croak("ssl argument should point to a hashref");
}
else {
ssl = MUTABLE_HV(SvRV(*svp));
}
#define ssl_config_set(s) STMT_START { \
const char *tmp = easy_arg_fetch(ssl, #s, FALSE); \
( run in 0.550 second using v1.01-cache-2.11-cpan-6aa56a78535 )