some work on mod-mysql
This commit is contained in:
parent
560298d0d1
commit
aa3a219f56
@ -144,7 +144,6 @@ static void __FREE_IMAP_NODE (qse_awk_rtx_t* rtx, __IMAP_LIST_T* list, __IMAP_NO
|
|||||||
{
|
{
|
||||||
curnode = list->free;
|
curnode = list->free;
|
||||||
list->free = list->free->next;
|
list->free = list->free->next;
|
||||||
QSE_ASSERT (curnode->ctx == QSE_NULL);
|
|
||||||
qse_awk_rtx_freemem (rtx, curnode);
|
qse_awk_rtx_freemem (rtx, curnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
#include <qse/cmn/main.h>
|
#include <qse/cmn/main.h>
|
||||||
#include <qse/cmn/rbt.h>
|
#include <qse/cmn/rbt.h>
|
||||||
|
|
||||||
#define __IMAP_NODE_T_DATA MYSQL* ctx;
|
#define __IMAP_NODE_T_DATA MYSQL* mysql;
|
||||||
#define __IMAP_LIST_T_DATA int errnum;
|
#define __IMAP_LIST_T_DATA int errnum;
|
||||||
#define __IMAP_LIST_T sql_list_t
|
#define __IMAP_LIST_T sql_list_t
|
||||||
#define __IMAP_NODE_T sql_node_t
|
#define __IMAP_NODE_T sql_node_t
|
||||||
@ -45,8 +45,8 @@ static sql_node_t* new_sql_node (qse_awk_rtx_t* rtx, sql_list_t* list)
|
|||||||
node = __new_sql_node(rtx, list);
|
node = __new_sql_node(rtx, list);
|
||||||
if (!node) return QSE_NULL;
|
if (!node) return QSE_NULL;
|
||||||
|
|
||||||
node->ctx = mysql_init(QSE_NULL);
|
node->mysql = mysql_init(QSE_NULL);
|
||||||
if (!node->ctx)
|
if (!node->mysql)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_seterrfmt (rtx, QSE_AWK_ENOMEM, QSE_NULL, QSE_T("unable to allocate a mysql object"));
|
qse_awk_rtx_seterrfmt (rtx, QSE_AWK_ENOMEM, QSE_NULL, QSE_T("unable to allocate a mysql object"));
|
||||||
return QSE_NULL;
|
return QSE_NULL;
|
||||||
@ -57,29 +57,13 @@ static sql_node_t* new_sql_node (qse_awk_rtx_t* rtx, sql_list_t* list)
|
|||||||
|
|
||||||
static void free_sql_node (qse_awk_rtx_t* rtx, sql_list_t* list, sql_node_t* node)
|
static void free_sql_node (qse_awk_rtx_t* rtx, sql_list_t* list, sql_node_t* node)
|
||||||
{
|
{
|
||||||
mysql_close (node->ctx);
|
mysql_close (node->mysql);
|
||||||
|
node->mysql = QSE_NULL;
|
||||||
__free_sql_node (rtx, list, node);
|
__free_sql_node (rtx, list, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
static int close_byid (qse_awk_rtx_t* rtx, sql_list_t* list, qse_awk_int_t id)
|
|
||||||
{
|
|
||||||
if (id >= 0 && id < list->map.high && list->map.tab[id])
|
|
||||||
{
|
|
||||||
free_sql_node (rtx, list, list->map.tab[id]);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* TODO: enhance error */
|
|
||||||
list->errnum = QSE_AWK_EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
qse_rbt_pair_t* pair;
|
qse_rbt_pair_t* pair;
|
||||||
@ -88,6 +72,11 @@ static QSE_INLINE sql_list_t* rtx_to_list (qse_awk_rtx_t* rtx, const qse_awk_fnc
|
|||||||
return (sql_list_t*)QSE_RBT_VPTR(pair);
|
return (sql_list_t*)QSE_RBT_VPTR(pair);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QSE_INLINE sql_node_t* get_list_node (sql_list_t* list, qse_awk_int_t id)
|
||||||
|
{
|
||||||
|
if (id < 0 || id >= list->map.high || !list->map.tab[id]) return QSE_NULL;
|
||||||
|
return list->map.tab[id];
|
||||||
|
}
|
||||||
|
|
||||||
static int fnc_open (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
static int fnc_open (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
||||||
{
|
{
|
||||||
@ -98,11 +87,10 @@ static int fnc_open (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
|
|
||||||
list = rtx_to_list(rtx, fi);
|
list = rtx_to_list(rtx, fi);
|
||||||
|
|
||||||
node = new_sql_node(rtx, list/*, path, flags*/);
|
node = new_sql_node(rtx, list);
|
||||||
if (node) ret = node->id;
|
if (node) ret = node->id;
|
||||||
else ret = -1;
|
else ret = -1;
|
||||||
|
|
||||||
|
|
||||||
/* ret may not be a statically managed number.
|
/* ret may not be a statically managed number.
|
||||||
* error checking is required */
|
* error checking is required */
|
||||||
retv = qse_awk_rtx_makeintval(rtx, ret);
|
retv = qse_awk_rtx_makeintval(rtx, ret);
|
||||||
@ -119,6 +107,7 @@ static int fnc_open (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
static int fnc_close (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
static int fnc_close (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
||||||
{
|
{
|
||||||
sql_list_t* list;
|
sql_list_t* list;
|
||||||
|
sql_node_t* node;
|
||||||
qse_awk_int_t id;
|
qse_awk_int_t id;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -130,9 +119,15 @@ static int fnc_close (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
list->errnum = qse_awk_rtx_geterrnum(rtx);
|
list->errnum = qse_awk_rtx_geterrnum(rtx);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
|
else if (!(node = get_list_node(list, id)))
|
||||||
|
{
|
||||||
|
/* TODO: enhance error */
|
||||||
|
list->errnum = QSE_AWK_EINVAL;
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ret = close_byid(rtx, list, id);
|
free_sql_node (rtx, list, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_awk_rtx_setretval (rtx, qse_awk_rtx_makeintval(rtx, ret));
|
qse_awk_rtx_setretval (rtx, qse_awk_rtx_makeintval(rtx, ret));
|
||||||
@ -141,7 +136,37 @@ static int fnc_close (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
|
|
||||||
static int fnc_connect (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
static int fnc_connect (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;
|
||||||
|
|
||||||
|
list = rtx_to_list(rtx, fi);
|
||||||
|
|
||||||
|
ret = qse_awk_rtx_valtoint(rtx, qse_awk_rtx_getarg(rtx, 0), &id);
|
||||||
|
if (ret <= -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))
|
||||||
|
{
|
||||||
|
/* TODO: capture error message... */
|
||||||
|
list->errnum = QSE_AWK_ESYSERR;
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
static int fnc_query (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
||||||
@ -163,8 +188,8 @@ 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"), { { 1, 1, QSE_NULL }, fnc_connect, 0 } },
|
{ QSE_T("connect"), { { 4, 1, QSE_NULL }, fnc_connect, 0 } },
|
||||||
{ QSE_T("open"), { { 1, 1, QSE_NULL }, fnc_open, 0 } },
|
{ QSE_T("open"), { { 0, 0, QSE_NULL }, fnc_open, 0 } },
|
||||||
{ QSE_T("query"), { { 2, 3, QSE_NULL }, fnc_query, 0 } },
|
{ QSE_T("query"), { { 2, 3, QSE_NULL }, fnc_query, 0 } },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user