diff --git a/qse/cmd/awk/awk.c b/qse/cmd/awk/awk.c index 57c519fc..82c32161 100644 --- a/qse/cmd/awk/awk.c +++ b/qse/cmd/awk/awk.c @@ -1135,7 +1135,7 @@ static void open_mpi (mpi_t* mpi, int argc, qse_achar_t* argv[]) if (lt_dlinit () != 0) return; - if (lt_dladvise_init (&adv) != 0) goto oops; + if (lt_dladvise_init(&adv) != 0) goto oops; /* If i don't set the global option, loading may end up with an error * like this depending on your MPI library. @@ -1143,23 +1143,23 @@ static void open_mpi (mpi_t* mpi, int argc, qse_achar_t* argv[]) * symbol lookup error: /usr/lib/openmpi/lib/openmpi/mca_paffinity_linux.so: undefined symbol: mca_base_param_reg_int */ - if (lt_dladvise_global (&adv) != 0 || lt_dladvise_ext (&adv) != 0) + if (lt_dladvise_global(&adv) != 0 || lt_dladvise_ext(&adv) != 0) { lt_dladvise_destroy (&adv); goto oops; } - mpi->h = lt_dlopenadvise (DEFAULT_MODPREFIX "mpi" DEFAULT_MODPOSTFIX, adv); + mpi->h = lt_dlopenadvise(DEFAULT_MODPREFIX "mpi" DEFAULT_MODPOSTFIX, adv); lt_dladvise_destroy (&adv); if (mpi->h) { - mpi->i = lt_dlsym (mpi->h, "qse_awk_mod_mpi_init"); - mpi->f = lt_dlsym (mpi->h, "qse_awk_mod_mpi_fini"); + mpi->i = lt_dlsym(mpi->h, "qse_awk_mod_mpi_init"); + mpi->f = lt_dlsym(mpi->h, "qse_awk_mod_mpi_fini"); if (mpi->i == QSE_NULL || mpi->f == QSE_NULL || - mpi->i (argc, argv) <= -1) + mpi->i(argc, argv) <= -1) { lt_dlclose (mpi->h); mpi->h = QSE_NULL; diff --git a/qse/lib/awk/Makefile.am b/qse/lib/awk/Makefile.am index 1496bbe5..5e845483 100644 --- a/qse/lib/awk/Makefile.am +++ b/qse/lib/awk/Makefile.am @@ -37,7 +37,7 @@ endif noinst_HEADERS = awk-prv.h err.h rio.h val.h fnc.h misc.h parse.h run.h tree.h std.h lib_LTLIBRARIES = libqseawk.la -libqseawk_la_SOURCES = awk.c err.c tree.c parse.c run.c rec.c val.c val-imp.h fnc.c misc.c misc-imp.h rio.c std.c +libqseawk_la_SOURCES = awk.c err.c tree.c parse.c run.c rec.c val.c val-imp.h fnc.c imap-imp.h misc.c misc-imp.h rio.c std.c libqseawk_la_CPPFLAGS = $(CPPFLAGS_LIB_COMMON) libqseawk_la_LDFLAGS = $(LDFLAGS_LIB_COMMON) libqseawk_la_LIBADD = $(LIBADD_LIB_COMMON) diff --git a/qse/lib/awk/Makefile.in b/qse/lib/awk/Makefile.in index f49c8880..fa8994d8 100644 --- a/qse/lib/awk/Makefile.in +++ b/qse/lib/awk/Makefile.in @@ -219,7 +219,7 @@ libqseawk_sys_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ am__DEPENDENCIES_4 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) \ $(am__DEPENDENCIES_3) am__libqseawk_la_SOURCES_DIST = awk.c err.c tree.c parse.c run.c rec.c \ - val.c val-imp.h fnc.c misc.c misc-imp.h rio.c std.c mod-dir.c \ + val.c val-imp.h fnc.c imap-imp.h misc.c misc-imp.h rio.c std.c mod-dir.c \ mod-dir.h mod-math.c mod-math.h mod-str.c mod-str.h mod-sys.c \ mod-sys.h @ENABLE_STATIC_MODULE_TRUE@am__objects_1 = libqseawk_la-mod-dir.lo \ @@ -516,7 +516,7 @@ LIBADD_LIB_COMMON = -lqsecmn -lqsesi $(LIBM) $(am__append_1) \ noinst_HEADERS = awk-prv.h err.h rio.h val.h fnc.h misc.h parse.h run.h tree.h std.h lib_LTLIBRARIES = libqseawk.la $(am__append_5) libqseawk_la_SOURCES = awk.c err.c tree.c parse.c run.c rec.c val.c \ - val-imp.h fnc.c misc.c misc-imp.h rio.c std.c $(am__append_6) + val-imp.h fnc.c imap-imp.h misc.c misc-imp.h rio.c std.c $(am__append_6) libqseawk_la_CPPFLAGS = $(CPPFLAGS_LIB_COMMON) libqseawk_la_LDFLAGS = $(LDFLAGS_LIB_COMMON) libqseawk_la_LIBADD = $(LIBADD_LIB_COMMON) $(am__append_7) \ diff --git a/qse/lib/awk/imap-imp.h b/qse/lib/awk/imap-imp.h new file mode 100644 index 00000000..734362e6 --- /dev/null +++ b/qse/lib/awk/imap-imp.h @@ -0,0 +1,155 @@ +/* + * $Id$ + * + Copyright (c) 2006-2014 Chung, Hyung-Hwan. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* THIS FILE IS SUPPOSED TO BE INCLUDED BY MODULE SOURCE THAT MAINTAINS MAPPING BETWEEN ID AND DATA */ + +typedef struct __IMAP_NODE_T __IMAP_NODE_T; +struct __IMAP_NODE_T +{ + __IMAP_NODE_T* prev; + __IMAP_NODE_T* next; + int id; + + __IMAP_NODE_T_DATA +}; + +struct __IMAP_LIST_T +{ + __IMAP_NODE_T* head; + __IMAP_NODE_T* tail; + __IMAP_NODE_T* free; + + /* mapping table to map 'id' to 'node' */ + struct + { + __IMAP_NODE_T** tab; + int capa; + int high; + } map; + + __IMAP_LIST_T_DATA +}; + +static __IMAP_NODE_T* __MAKE_IMAP_NODE (qse_awk_rtx_t* rtx, __IMAP_LIST_T* list) +{ + /* create a new context node and append it to the list tail */ + __IMAP_NODE_T* node; + + node = QSE_NULL; + + if (list->free) node = list->free; + else + { + node = qse_awk_rtx_callocmem(rtx, QSE_SIZEOF(*node)); + if (!node) goto oops; + } + + if (node == list->free) list->free = node->next; + else + { + if (list->map.high <= list->map.capa) + { + qse_size_t newcapa, inc; + __IMAP_NODE_T** tmp; + + inc = QSE_TYPE_MAX(int) - list->map.capa; + if (inc == 0) goto oops; /* too many ndoes */ + + if (inc > 64) inc = 64; + newcapa = (qse_size_t)list->map.capa + inc; + + tmp = (__IMAP_NODE_T**)qse_awk_rtx_reallocmem(rtx, list->map.tab, QSE_SIZEOF(*tmp) * newcapa); + if (!tmp) goto oops; + + QSE_MEMSET (&tmp[list->map.capa], 0, QSE_SIZEOF(*tmp) * (newcapa - list->map.capa)); + + list->map.tab = tmp; + list->map.capa = newcapa; + } + + node->id = list->map.high; + QSE_ASSERT (list->map.tab[node->id] == QSE_NULL); + list->map.tab[node->id] = node; + list->map.high++; + } + + /* append it to the tail */ + node->next = QSE_NULL; + node->prev = list->tail; + if (list->tail) list->tail->next = node; + else list->head = node; + list->tail = node; + + return node; + +oops: + if (node) qse_awk_rtx_freemem (rtx, node); + return QSE_NULL; +} + +static void __FREE_IMAP_NODE (qse_awk_rtx_t* rtx, __IMAP_LIST_T* list, __IMAP_NODE_T* node) +{ + if (node->prev) node->prev->next = node->next; + if (node->next) node->next->prev = node->prev; + if (list->head == node) list->head = node->next; + if (list->tail == node) list->tail = node->prev; + + list->map.tab[node->id] = QSE_NULL; + + if (list->map.high == node->id + 1) + { + /* destroy the actual node if the node to be freed has the + * highest id */ + qse_awk_rtx_freemem (rtx, node); + list->map.high--; + } + else + { + /* otherwise, chain the node to the free list */ + node->next = list->free; + list->free = node; + } + + /* however, i destroy the whole free list when all the nodes are + * chanined to the free list */ + if (list->head == QSE_NULL) + { + __IMAP_NODE_T* curnode; + + while (list->free) + { + curnode = list->free; + list->free = list->free->next; + QSE_ASSERT (curnode->ctx == QSE_NULL); + qse_awk_rtx_freemem (rtx, curnode); + } + + qse_awk_rtx_freemem (rtx, list->map.tab); + list->map.high = 0; + list->map.capa = 0; + list->map.tab = QSE_NULL; + } +} diff --git a/qse/lib/awk/mod-dir.c b/qse/lib/awk/mod-dir.c index 119a2ea5..719ba976 100644 --- a/qse/lib/awk/mod-dir.c +++ b/qse/lib/awk/mod-dir.c @@ -62,31 +62,6 @@ enum DIR_EMAPTOSCALAR }; -struct dir_node_t -{ - int id; - qse_dir_t* ctx; - dir_node_t* prev; - dir_node_t* next; -}; - -struct dir_list_t -{ - dir_node_t* head; - dir_node_t* tail; - dir_node_t* free; - - /* mapping table to map 'id' to 'node' */ - struct - { - dir_node_t** tab; - qse_size_t capa; - qse_size_t high; - } map; - - int errnum; -}; - static int dir_err_to_errnum (qse_dir_errnum_t num) { switch (num) @@ -103,7 +78,7 @@ static int dir_err_to_errnum (qse_dir_errnum_t num) return DIR_EPERM; case QSE_DIR_ENOENT: return DIR_ENOENT; - default: + default: return DIR_EOTHER; } } @@ -126,136 +101,51 @@ static int awk_err_to_errnum (qse_awk_errnum_t num) return DIR_ENOENT; case QSE_AWK_EMAPTOSCALAR: return DIR_EMAPTOSCALAR; - default: + default: return DIR_EOTHER; } } +#define __IMAP_NODE_T_DATA qse_dir_t* ctx; +#define __IMAP_LIST_T_DATA int errnum; +#define __IMAP_LIST_T dir_list_t +#define __IMAP_NODE_T dir_node_t +#define __MAKE_IMAP_NODE __new_dir_node +#define __FREE_IMAP_NODE __free_dir_node +#include "imap-imp.h" + static dir_node_t* new_dir_node (qse_awk_rtx_t* rtx, dir_list_t* list, const qse_char_t* path, qse_awk_int_t flags) { - /* create a new context node and append it to the list tail */ dir_node_t* node; qse_dir_errnum_t oe; - node = QSE_NULL; - - if (list->free) node = list->free; - else + node = __new_dir_node(rtx, list); + if (!node) { - node = qse_awk_rtx_callocmem (rtx, QSE_SIZEOF(*node)); - if (!node) - { - list->errnum = DIR_ENOMEM; - goto oops; - } + list->errnum = DIR_ENOMEM; + return QSE_NULL; } - node->ctx = qse_dir_open (qse_awk_rtx_getmmgr(rtx), 0, path, flags, &oe); + node->ctx = qse_dir_open(qse_awk_rtx_getmmgr(rtx), 0, path, flags, &oe); if (!node->ctx) { - list->errnum = dir_err_to_errnum (oe); - goto oops; + list->errnum = dir_err_to_errnum(oe); + __free_dir_node (rtx, list, node); + return QSE_NULL; } - if (node == list->free) list->free = node->next; - else - { - if (list->map.high <= list->map.capa) - { - qse_size_t newcapa; - dir_node_t** tmp; - - newcapa = list->map.capa + 64; - if (newcapa < list->map.capa) goto oops; /* overflow */ - - tmp = (dir_node_t**) qse_awk_rtx_reallocmem ( - rtx, list->map.tab, QSE_SIZEOF(*tmp) * newcapa); - if (!tmp) - { - list->errnum = DIR_ENOMEM; - goto oops; - } - - QSE_MEMSET (&tmp[list->map.capa], 0, - QSE_SIZEOF(*tmp) * (newcapa - list->map.capa)); - - list->map.tab = tmp; - list->map.capa = newcapa; - } - - node->id = list->map.high; - QSE_ASSERT (list->map.tab[node->id] == QSE_NULL); - list->map.tab[node->id] = node; - list->map.high++; - } - - /* append it to the tail */ - node->next = QSE_NULL; - node->prev = list->tail; - if (list->tail) list->tail->next = node; - else list->head = node; - list->tail = node; - return node; - -oops: - if (node) qse_awk_rtx_freemem (rtx, node); - return QSE_NULL; } static void free_dir_node (qse_awk_rtx_t* rtx, dir_list_t* list, dir_node_t* node) { - if (node->prev) node->prev->next = node->next; - if (node->next) node->next->prev = node->prev; - if (list->head == node) list->head = node->next; - if (list->tail == node) list->tail = node->prev; - - list->map.tab[node->id] = QSE_NULL; - if (node->ctx) { - qse_dir_close (node->ctx); - } - - if (list->map.high == node->id + 1) - { - /* destroy the actual node if the node to be freed has the - * highest id */ - QSE_MMGR_FREE (qse_awk_rtx_getmmgr(rtx), node); - list->map.high--; - } - else - { - /* otherwise, chain the node to the free list */ + qse_dir_close(node->ctx); node->ctx = QSE_NULL; - node->next = list->free; - list->free = node; - } - - /* however, i destroy the whole free list when all the nodes are - * chanined to the free list */ - if (list->head == QSE_NULL) - { - qse_mmgr_t* mmgr; - dir_node_t* curnode; - - mmgr = qse_awk_rtx_getmmgr(rtx); - - while (list->free) - { - curnode = list->free; - list->free = list->free->next; - QSE_ASSERT (curnode->ctx == QSE_NULL); - QSE_MMGR_FREE (mmgr, curnode); - } - - QSE_MMGR_FREE (mmgr, list->map.tab); - list->map.high = 0; - list->map.capa = 0; - list->map.tab = QSE_NULL; } + __free_dir_node (rtx, list, node); } - /* ------------------------------------------------------------------------ */ static int close_byid (qse_awk_rtx_t* rtx, dir_list_t* list, qse_awk_int_t id) @@ -276,7 +166,7 @@ static int reset_byid (qse_awk_rtx_t* rtx, dir_list_t* list, qse_awk_int_t id, c { if (id >= 0 && id < list->map.high && list->map.tab[id]) { - if (qse_dir_reset (list->map.tab[id]->ctx, path) <= -1) + if (qse_dir_reset(list->map.tab[id]->ctx, path) <= -1) { list->errnum = dir_err_to_errnum (qse_dir_geterrnum (list->map.tab[id]->ctx)); return -1; @@ -298,10 +188,10 @@ static int read_byid (qse_awk_rtx_t* rtx, dir_list_t* list, qse_awk_int_t id, qs qse_dir_ent_t ent; qse_awk_val_t* tmp; - y = qse_dir_read (list->map.tab[id]->ctx, &ent); + y = qse_dir_read(list->map.tab[id]->ctx, &ent); if (y <= -1) { - list->errnum = dir_err_to_errnum (qse_dir_geterrnum (list->map.tab[id]->ctx)); + list->errnum = dir_err_to_errnum(qse_dir_geterrnum (list->map.tab[id]->ctx)); return -1; } @@ -336,7 +226,7 @@ static int read_byid (qse_awk_rtx_t* rtx, dir_list_t* list, qse_awk_int_t id, qs static QSE_INLINE dir_list_t* rtx_to_list (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) { qse_rbt_pair_t* pair; - pair = qse_rbt_search ((qse_rbt_t*)fi->mod->ctx, &rtx, QSE_SIZEOF(rtx)); + pair = qse_rbt_search((qse_rbt_t*)fi->mod->ctx, &rtx, QSE_SIZEOF(rtx)); QSE_ASSERT (pair != QSE_NULL); return (dir_list_t*)QSE_RBT_VPTR(pair); } @@ -346,7 +236,7 @@ static int fnc_dir_errno (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) dir_list_t* list; qse_awk_val_t* retv; - list = rtx_to_list (rtx, fi); + list = rtx_to_list(rtx, fi); retv = qse_awk_rtx_makeintval (rtx, list->errnum); if (retv == QSE_NULL) return -1; @@ -375,7 +265,7 @@ static int fnc_dir_errstr (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) qse_awk_val_t* retv; qse_awk_int_t errnum; - list = rtx_to_list (rtx, fi); + list = rtx_to_list(rtx, fi); if (qse_awk_rtx_getnargs (rtx) <= 0 || qse_awk_rtx_valtoint (rtx, qse_awk_rtx_getarg (rtx, 0), &errnum) <= -1) @@ -402,7 +292,7 @@ static int fnc_dir_open (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) qse_awk_val_t* a0; qse_awk_int_t flags = 0; - list = rtx_to_list (rtx, fi); + list = rtx_to_list(rtx, fi); a0 = qse_awk_rtx_getarg (rtx, 0); path = qse_awk_rtx_getvalstr (rtx, a0, QSE_NULL); @@ -445,18 +335,18 @@ static int fnc_dir_close (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) dir_list_t* list; 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); + list = rtx_to_list(rtx, fi); + + ret = qse_awk_rtx_valtoint(rtx, qse_awk_rtx_getarg (rtx, 0), &id); if (ret <= -1) { - list->errnum = awk_err_to_errnum (qse_awk_rtx_geterrnum (rtx)); + list->errnum = awk_err_to_errnum(qse_awk_rtx_geterrnum (rtx)); ret = -1; } else { - ret = close_byid (rtx, list, id); + ret = close_byid(rtx, list, id); } qse_awk_rtx_setretval (rtx, qse_awk_rtx_makeintval (rtx, ret)); @@ -470,7 +360,7 @@ static int fnc_dir_reset (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) int ret; qse_char_t* path; - 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 (ret <= -1) @@ -506,13 +396,13 @@ static int fnc_dir_read (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) dir_list_t* list; 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); + list = rtx_to_list(rtx, fi); + + ret = qse_awk_rtx_valtoint(rtx, qse_awk_rtx_getarg (rtx, 0), &id); if (ret <= -1) { - list->errnum = awk_err_to_errnum (qse_awk_rtx_geterrnum (rtx)); + list->errnum = awk_err_to_errnum(qse_awk_rtx_geterrnum (rtx)); } else { @@ -630,7 +520,7 @@ static void fini (qse_awk_mod_t* mod, qse_awk_rtx_t* rtx) rbt = (qse_rbt_t*)mod->ctx; /* garbage clean-up */ - pair = qse_rbt_search (rbt, &rtx, QSE_SIZEOF(rtx)); + pair = qse_rbt_search(rbt, &rtx, QSE_SIZEOF(rtx)); if (pair) { dir_list_t* list; @@ -669,7 +559,7 @@ int qse_awk_mod_dir (qse_awk_mod_t* mod, qse_awk_t* awk) mod->init = init; mod->fini = fini; - rbt = qse_rbt_open (qse_awk_getmmgr(awk), 0, 1, 1); + rbt = qse_rbt_open(qse_awk_getmmgr(awk), 0, 1, 1); if (rbt == QSE_NULL) { qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL); diff --git a/qse/lib/awkmod/mod-mpi.c b/qse/lib/awkmod/mod-mpi.c index 6394277b..938b528d 100644 --- a/qse/lib/awkmod/mod-mpi.c +++ b/qse/lib/awkmod/mod-mpi.c @@ -282,11 +282,11 @@ int qse_awk_mod_mpi (qse_awk_mod_t* mod, qse_awk_t* awk) * and the module wasn't built. So you can't access mpi::xxx symbols either */ -QSE_EXPORT int qse_awk_mod_mpi_init (int argc, qse_achar_t* argv[]) +int qse_awk_mod_mpi_init (int argc, qse_achar_t* argv[]) { int rx; - if (MPI_Init (&argc, &argv) != MPI_SUCCESS) rx = -1; + if (MPI_Init(&argc, &argv) != MPI_SUCCESS) rx = -1; else { MPI_Comm_set_errhandler (MPI_COMM_WORLD, MPI_ERRORS_RETURN); @@ -296,7 +296,7 @@ QSE_EXPORT int qse_awk_mod_mpi_init (int argc, qse_achar_t* argv[]) return rx; } -QSE_EXPORT void qse_awk_mod_mpi_fini (void) +void qse_awk_mod_mpi_fini (void) { MPI_Finalize (); } diff --git a/qse/lib/awkmod/mod-mpi.h b/qse/lib/awkmod/mod-mpi.h index 348300b0..16169f9e 100644 --- a/qse/lib/awkmod/mod-mpi.h +++ b/qse/lib/awkmod/mod-mpi.h @@ -35,6 +35,10 @@ extern "C" { QSE_EXPORT int qse_awk_mod_mpi (qse_awk_mod_t* mod, qse_awk_t* awk); + +QSE_EXPORT int qse_awk_mod_mpi_init (int argc, qse_achar_t* argv[]); +QSE_EXPORT void qse_awk_mod_mpi_fini (void); + #if defined(__cplusplus) } #endif diff --git a/qse/lib/awkmod/mod-mysql.c b/qse/lib/awkmod/mod-mysql.c index 213b13d2..211cf4f5 100644 --- a/qse/lib/awkmod/mod-mysql.c +++ b/qse/lib/awkmod/mod-mysql.c @@ -25,9 +25,41 @@ */ #include "mod-mysql.h" +#include + +#define __IMAP_NODE_T_DATA MYSQL ctx; +#define __IMAP_LIST_T_DATA /* nothing */ +#define __IMAP_LIST_T sql_list_t +#define __IMAP_NODE_T sql_node_t +#define __MAKE_IMAP_NODE __new_sql_node +#define __FREE_IMAP_NODE __free_sql_node +#include "../lib/awk/imap-imp.h" + +static sql_node_t* new_sql_node (qse_awk_rtx_t* rtx, sql_list_t* list) +{ + sql_node_t* node; + + node = __new_sql_node(rtx, list); + if (!node) return QSE_NULL; + + if (mysql_init(&node->ctx) == QSE_NULL) + { + __free_sql_node (rtx, list, node); + return QSE_NULL; + } + + return node; +} + +static void free_sql_node (qse_awk_rtx_t* rtx, sql_list_t* list, sql_node_t* node) +{ + mysqL_close (&node->ctx); + __free_sql_node (rtx, list, node); +} static int fnc_open (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) { + sql_node_t* node; return -1; } @@ -115,12 +147,14 @@ static int query (qse_awk_mod_t* mod, qse_awk_t* awk, const qse_char_t* name, qs static int init (qse_awk_mod_t* mod, qse_awk_rtx_t* rtx) { + mysql_library_init (0, QSE_NULL, QSE_NULL); return 0; } static void fini (qse_awk_mod_t* mod, qse_awk_rtx_t* rtx) { /* TODO: anything */ + mysql_library_end (); } static void unload (qse_awk_mod_t* mod, qse_awk_t* awk) @@ -139,5 +173,19 @@ int qse_awk_mod_mysql (qse_awk_mod_t* mod, qse_awk_t* awk) mod->ctx... */ + + return 0; } + + +int qse_awk_mod_mysql_init (int argc, qse_achar_t* argv[]) +{ + if (mysql_library_init(argc, argv, QSE_NULL) != 0) return -1; + return 0; +} + +void qse_awk_mod_mysql_fini (void) +{ + mysql_library_end (); +} diff --git a/qse/lib/awkmod/mod-mysql.h b/qse/lib/awkmod/mod-mysql.h index 1924118d..95a16c6a 100644 --- a/qse/lib/awkmod/mod-mysql.h +++ b/qse/lib/awkmod/mod-mysql.h @@ -35,6 +35,10 @@ extern "C" { QSE_EXPORT int qse_awk_mod_mysql (qse_awk_mod_t* mod, qse_awk_t* awk); + +QSE_EXPORT int qse_awk_mod_mysql_init (int argc, qse_achar_t* argv[]); +QSE_EXPORT void qse_awk_mod_mysql_fini (void); + #if defined(__cplusplus) } #endif