more code to mod-mysql
This commit is contained in:
		@ -193,7 +193,7 @@ static qse_htb_walk_t print_awk_value (
 | 
			
		||||
 | 
			
		||||
	qse_awk_rtx_geterrinf (rtx, &oerrinf);
 | 
			
		||||
 | 
			
		||||
	str = qse_awk_rtx_valtostrdup (rtx, QSE_HTB_VPTR(pair), &len);
 | 
			
		||||
	str = qse_awk_rtx_valtostrdup(rtx, QSE_HTB_VPTR(pair), &len);
 | 
			
		||||
	if (str == QSE_NULL)
 | 
			
		||||
	{
 | 
			
		||||
		if (qse_awk_rtx_geterrnum(rtx) == QSE_AWK_EVALTOSTR)
 | 
			
		||||
 | 
			
		||||
@ -1963,7 +1963,7 @@ qse_awk_val_t* qse_awk_rtx_getrefval (qse_awk_rtx_t* rtx, qse_awk_val_ref_t* ref
 | 
			
		||||
		case QSE_AWK_VAL_REF_POS:
 | 
			
		||||
		{
 | 
			
		||||
			/* a positional doesn't contain a value. you should use qse_awk_rtx_valtoXXX()
 | 
			
		||||
			 * like qse_awk_rtx_valtostr(), qse_Awk_rtx_valtoint() */
 | 
			
		||||
			 * like qse_awk_rtx_valtostr(), qse_awk_rtx_valtoint() */
 | 
			
		||||
			return QSE_NULL;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -62,6 +62,22 @@ static void free_sql_node (qse_awk_rtx_t* rtx, sql_list_t* list, sql_node_t* nod
 | 
			
		||||
	__free_sql_node (rtx, list, node);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef __IMAP_NODE_T_DATA
 | 
			
		||||
#undef __IMAP_LIST_T_DATA
 | 
			
		||||
#undef __IMAP_LIST_T
 | 
			
		||||
#undef __IMAP_NODE_T
 | 
			
		||||
#undef __MAKE_IMAP_NODE
 | 
			
		||||
#undef __FREE_IMAP_NODE
 | 
			
		||||
 | 
			
		||||
#define __IMAP_NODE_T_DATA  MYSQL_RES* res;
 | 
			
		||||
#define __IMAP_LIST_T_DATA  int errnum;
 | 
			
		||||
#define __IMAP_LIST_T res_list_t
 | 
			
		||||
#define __IMAP_NODE_T res_node_t
 | 
			
		||||
#define __MAKE_IMAP_NODE __new_res_node
 | 
			
		||||
#define __FREE_IMAP_NODE __free_res_node
 | 
			
		||||
#include "../lib/awk/imap-imp.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* ------------------------------------------------------------------------ */
 | 
			
		||||
 | 
			
		||||
static QSE_INLINE sql_list_t* rtx_to_list (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
 | 
			
		||||
@ -139,41 +155,140 @@ static int fnc_connect (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
 | 
			
		||||
	sql_list_t* list;
 | 
			
		||||
	sql_node_t* node;
 | 
			
		||||
	qse_awk_int_t id;
 | 
			
		||||
	int ret;
 | 
			
		||||
	int ret = -1;
 | 
			
		||||
 | 
			
		||||
	qse_awk_val_t* a1, * a2, * a3;
 | 
			
		||||
	qse_mchar_t* host = QSE_NULL;
 | 
			
		||||
	qse_mchar_t* user = QSE_NULL;
 | 
			
		||||
	qse_mchar_t* pass = QSE_NULL;
 | 
			
		||||
 | 
			
		||||
	list = rtx_to_list(rtx, fi);
 | 
			
		||||
 | 
			
		||||
	ret = qse_awk_rtx_valtoint(rtx, qse_awk_rtx_getarg(rtx, 0), &id);
 | 
			
		||||
	if (ret <= -1)
 | 
			
		||||
	if (qse_awk_rtx_valtoint(rtx, qse_awk_rtx_getarg(rtx, 0), &id) <= -1)
 | 
			
		||||
	{
 | 
			
		||||
		list->errnum = qse_awk_rtx_geterrnum(rtx);
 | 
			
		||||
		ret = -1;
 | 
			
		||||
	}
 | 
			
		||||
	else if (!(node = get_list_node(list, id)))
 | 
			
		||||
	{
 | 
			
		||||
/* TODO: enhance error */
 | 
			
		||||
		list->errnum = QSE_AWK_EINVAL;
 | 
			
		||||
		ret = -1;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		if (!mysql_real_connect(node->mysql, QSE_NULL, QSE_NULL, QSE_NULL, QSE_NULL, 0, QSE_NULL, 0))
 | 
			
		||||
		a1 = qse_awk_rtx_getarg(rtx, 1);
 | 
			
		||||
		a2 = qse_awk_rtx_getarg(rtx, 2);
 | 
			
		||||
		a3 = qse_awk_rtx_getarg(rtx, 3);
 | 
			
		||||
 | 
			
		||||
		host = qse_awk_rtx_getvalmbs(rtx, a1, QSE_NULL);
 | 
			
		||||
		if (!host) goto done; /* TODO: set list->errnum ... */
 | 
			
		||||
		user = qse_awk_rtx_getvalmbs(rtx, a2, QSE_NULL);
 | 
			
		||||
		if (!user) goto done;
 | 
			
		||||
		pass = qse_awk_rtx_getvalmbs(rtx, a3, QSE_NULL);
 | 
			
		||||
		if (!pass) goto done;
 | 
			
		||||
 | 
			
		||||
		if (!mysql_real_connect(node->mysql, host, user, pass, QSE_NULL, 0, QSE_NULL, 0))
 | 
			
		||||
		{
 | 
			
		||||
/* TODO: capture error message... */
 | 
			
		||||
			list->errnum = QSE_AWK_ESYSERR;
 | 
			
		||||
			ret = -1;
 | 
			
		||||
			goto done;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ret = 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
done:
 | 
			
		||||
	qse_awk_rtx_setretval (rtx, qse_awk_rtx_makeintval(rtx, ret));
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int fnc_query (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
 | 
			
		||||
{
 | 
			
		||||
	return -1;
 | 
			
		||||
	sql_list_t* list;
 | 
			
		||||
	sql_node_t* node;
 | 
			
		||||
	qse_awk_int_t id;
 | 
			
		||||
	int ret = -1;
 | 
			
		||||
 | 
			
		||||
	qse_awk_val_t* a1;
 | 
			
		||||
	qse_mchar_t* qstr = QSE_NULL;
 | 
			
		||||
 | 
			
		||||
	list = rtx_to_list(rtx, fi);
 | 
			
		||||
 | 
			
		||||
	if (qse_awk_rtx_valtoint(rtx, qse_awk_rtx_getarg(rtx, 0), &id) <= -1)
 | 
			
		||||
	{
 | 
			
		||||
		list->errnum = qse_awk_rtx_geterrnum(rtx);
 | 
			
		||||
	}
 | 
			
		||||
	else if (!(node = get_list_node(list, id)))
 | 
			
		||||
	{
 | 
			
		||||
/* TODO: enhance error */
 | 
			
		||||
		list->errnum = QSE_AWK_EINVAL;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		qse_size_t qlen;
 | 
			
		||||
		a1 = qse_awk_rtx_getarg(rtx, 1);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		qstr = qse_awk_rtx_getvalmbs(rtx, a1, &qlen);
 | 
			
		||||
		if (!qstr) goto done; /* TODO: set list->errnum ... */
 | 
			
		||||
 | 
			
		||||
		if (mysql_real_query(node->mysql, qstr, qlen) != 0)
 | 
			
		||||
		{
 | 
			
		||||
/* TODO: capture error message... */
 | 
			
		||||
			list->errnum = QSE_AWK_ESYSERR;
 | 
			
		||||
			goto done;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ret = 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
done:
 | 
			
		||||
	qse_awk_rtx_setretval (rtx, qse_awk_rtx_makeintval(rtx, ret));
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int fnc_store_result (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
 | 
			
		||||
{
 | 
			
		||||
	sql_list_t* list;
 | 
			
		||||
	sql_node_t* node;
 | 
			
		||||
	qse_awk_int_t id;
 | 
			
		||||
	int ret = -1;
 | 
			
		||||
 | 
			
		||||
	list = rtx_to_list(rtx, fi);
 | 
			
		||||
 | 
			
		||||
	if (qse_awk_rtx_valtoint(rtx, qse_awk_rtx_getarg(rtx, 0), &id) <= -1)
 | 
			
		||||
	{
 | 
			
		||||
		list->errnum = qse_awk_rtx_geterrnum(rtx);
 | 
			
		||||
	}
 | 
			
		||||
	else if (!(node = get_list_node(list, id)))
 | 
			
		||||
	{
 | 
			
		||||
/* TODO: enhance error */
 | 
			
		||||
		list->errnum = QSE_AWK_EINVAL;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		MYSQL_RES* res;
 | 
			
		||||
 | 
			
		||||
		res = mysql_store_result(node->mysql);
 | 
			
		||||
		if (!res)
 | 
			
		||||
		{
 | 
			
		||||
/* TODO: capture error message... */
 | 
			
		||||
			list->errnum = QSE_AWK_ESYSERR;
 | 
			
		||||
			goto done;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
/* register this pointer to ASSSSS */
 | 
			
		||||
		ret = 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
done:
 | 
			
		||||
	qse_awk_rtx_setretval (rtx, qse_awk_rtx_makeintval(rtx, ret));
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int fnc_free_result (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
 | 
			
		||||
{
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef struct fnctab_t fnctab_t;
 | 
			
		||||
struct fnctab_t
 | 
			
		||||
@ -187,10 +302,12 @@ struct fnctab_t
 | 
			
		||||
static fnctab_t fnctab[] =
 | 
			
		||||
{
 | 
			
		||||
	/* keep this table sorted for binary search in query(). */
 | 
			
		||||
	{ QSE_T("close"),        { { 1, 1, QSE_NULL },   fnc_close,     0 } },
 | 
			
		||||
	{ QSE_T("connect"),      { { 4, 1, QSE_NULL },   fnc_connect,   0 } },
 | 
			
		||||
	{ QSE_T("open"),         { { 0, 0, QSE_NULL },   fnc_open,      0 } },
 | 
			
		||||
	{ QSE_T("query"),        { { 2, 3, QSE_NULL },   fnc_query,     0 } },
 | 
			
		||||
	{ QSE_T("close"),        { { 1, 1, QSE_NULL },   fnc_close,          0 } },
 | 
			
		||||
	{ QSE_T("connect"),      { { 4, 8, QSE_NULL },   fnc_connect,        0 } },
 | 
			
		||||
	{ QSE_T("free_result"),  { { 1, 1, QSE_NULL },   fnc_free_result,    0 } },
 | 
			
		||||
	{ QSE_T("open"),         { { 0, 0, QSE_NULL },   fnc_open,           0 } },
 | 
			
		||||
	{ QSE_T("query"),        { { 2, 2, QSE_NULL },   fnc_query,          0 } },
 | 
			
		||||
	{ QSE_T("store_result"), { { 1, 1, QSE_NULL },   fnc_store_result,   0 } }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static int query (qse_awk_mod_t* mod, qse_awk_t* awk, const qse_char_t* name, qse_awk_mod_sym_t* sym)
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user