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); | 	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 (str == QSE_NULL) | ||||||
| 	{ | 	{ | ||||||
| 		if (qse_awk_rtx_geterrnum(rtx) == QSE_AWK_EVALTOSTR) | 		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: | 		case QSE_AWK_VAL_REF_POS: | ||||||
| 		{ | 		{ | ||||||
| 			/* a positional doesn't contain a value. you should use qse_awk_rtx_valtoXXX() | 			/* 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; | 			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); | 	__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) | 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_list_t* list; | ||||||
| 	sql_node_t* node; | 	sql_node_t* node; | ||||||
| 	qse_awk_int_t id; | 	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); | 	list = rtx_to_list(rtx, fi); | ||||||
|  |  | ||||||
| 	ret = qse_awk_rtx_valtoint(rtx, qse_awk_rtx_getarg(rtx, 0), &id); | 	if (qse_awk_rtx_valtoint(rtx, qse_awk_rtx_getarg(rtx, 0), &id) <= -1) | ||||||
| 	if (ret <= -1) |  | ||||||
| 	{ | 	{ | ||||||
| 		list->errnum = qse_awk_rtx_geterrnum(rtx); | 		list->errnum = qse_awk_rtx_geterrnum(rtx); | ||||||
| 		ret = -1; |  | ||||||
| 	} | 	} | ||||||
| 	else if (!(node = get_list_node(list, id))) | 	else if (!(node = get_list_node(list, id))) | ||||||
| 	{ | 	{ | ||||||
| /* TODO: enhance error */ | /* TODO: enhance error */ | ||||||
| 		list->errnum = QSE_AWK_EINVAL; | 		list->errnum = QSE_AWK_EINVAL; | ||||||
| 		ret = -1; |  | ||||||
| 	} | 	} | ||||||
| 	else | 	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... */ | /* TODO: capture error message... */ | ||||||
| 			list->errnum = QSE_AWK_ESYSERR; | 			list->errnum = QSE_AWK_ESYSERR; | ||||||
| 			ret = -1; | 			goto done; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		ret = 0; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | done: | ||||||
| 	qse_awk_rtx_setretval (rtx, qse_awk_rtx_makeintval(rtx, ret)); | 	qse_awk_rtx_setretval (rtx, qse_awk_rtx_makeintval(rtx, ret)); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int fnc_query (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) | 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; | typedef struct fnctab_t fnctab_t; | ||||||
| struct fnctab_t | struct fnctab_t | ||||||
| @ -187,10 +302,12 @@ struct fnctab_t | |||||||
| static fnctab_t fnctab[] = | static fnctab_t fnctab[] = | ||||||
| { | { | ||||||
| 	/* keep this table sorted for binary search in query(). */ | 	/* keep this table sorted for binary search in query(). */ | ||||||
| 	{ QSE_T("close"),        { { 1, 1, QSE_NULL },   fnc_close,     0 } }, | 	{ QSE_T("close"),        { { 1, 1, QSE_NULL },   fnc_close,          0 } }, | ||||||
| 	{ QSE_T("connect"),      { { 4, 1, QSE_NULL },   fnc_connect,   0 } }, | 	{ QSE_T("connect"),      { { 4, 8, QSE_NULL },   fnc_connect,        0 } }, | ||||||
| 	{ QSE_T("open"),         { { 0, 0, QSE_NULL },   fnc_open,      0 } }, | 	{ QSE_T("free_result"),  { { 1, 1, QSE_NULL },   fnc_free_result,    0 } }, | ||||||
| 	{ QSE_T("query"),        { { 2, 3, QSE_NULL },   fnc_query,     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) | 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