more experimental code

This commit is contained in:
hyung-hwan 2020-06-18 09:28:36 +00:00
parent 6a38a82c7f
commit 364acf2b41

View File

@ -25,24 +25,49 @@
*/ */
#include <mio-mar.h> #include <mio-mar.h>
#include "mio-prv.h"
#include <mariadb/mysql.h> #include <mariadb/mysql.h>
typedef struct sess_t sess_t;
typedef struct sess_qry_t sess_qry_t;
struct mio_svc_marc_t struct mio_svc_marc_t
{ {
MIO_SVC_HEADER; MIO_SVC_HEADER;
struct
{
sess_t* ptr;
mio_oow_t capa;
} sess;
};
struct sess_qry_t
{
mio_bch_t* qptr;
mio_oow_t qlen;
void* qctx;
sess_qry_t* sq_next;
};
struct sess_t
{
mio_dev_mar_t* dev;
sess_qry_t* q_head;
sess_qry_t* q_tail
}; };
mio_svc_marc_t* mio_svc_marc_start (mio_t* mio) mio_svc_marc_t* mio_svc_marc_start (mio_t* mio)
{ {
mio_svc_marc_t* marc = MIO_NULL; mio_svc_marc_t* marc = MIO_NULL;
marc = (mio_svc_marc_t*)mio_callocmem(mio, MIO_SIZEOF(*marc)); marc = (mio_svc_marc_t*)mio_callocmem(mio, MIO_SIZEOF(*marc));
if (MIO_UNLIKELY(!marc)) goto oops; if (MIO_UNLIKELY(!marc)) goto oops;
marc->mio = mio; marc->mio = mio;
marc->svc_stop = mio_svc_marc_stop; marc->svc_stop = mio_svc_marc_stop;
MIO_SVCL_APPEND_SVC (&mio->actsvc, (mio_svc_t*)marc); MIO_SVCL_APPEND_SVC (&mio->actsvc, (mio_svc_t*)marc);
@ -142,22 +167,135 @@ static mio_dev_mar_t* alloc_device (mio_svc_marc_t* marc)
mar = mio_dev_mar_make(mio, 0, &mi); mar = mio_dev_mar_make(mio, 0, &mi);
if (!mar) return MIO_NULL; if (!mar) return MIO_NULL;
if (mio_dev_mar_connect(mar, &ci) <= -1) return MIO_NULL; if (mio_dev_mar_connect(mar, &ci) <= -1) return MIO_NULL;
return mar; return mar;
} }
int mio_svc_mar_querywithbchars (mio_svc_marc_t* marc, const mio_bch_t* qptr, mio_oow_t qlen)
static sess_qry_t* make_session_query (mio_t* mio, const mio_bch_t* qptr, mio_oow_t qlen, void* qctx)
{ {
mio_dev_mar_t* dev; sess_qry_t* sq;
sq = mio_allocmem(mio, MIO_SIZEOF(*sq) + (MIO_SIZEOF(*qptr) * qlen));
if (MIO_UNLIKELY(!sq)) return MIO_NULL;
MIO_MEMCPY (sq + 1, qptr, (MIO_SIZEOF(*qptr) * qlen));
sq->qptr = (mio_bch_t*)(sq + 1);
sq->qlen = qlen;
sq->qctx = qctx;
sq->sq_next = MIO_NULL;
return sq;
}
static MIO_INLINE void free_session_query (mio_t* mio, sess_qry_t* sq)
{
mio_freemem (mio, sq);
}
static sess_t* get_session (mio_svc_marc_t* marc, int sid)
{
mio_t* mio = marc->mio;
sess_t* sess;
if (sid >= marc->sess.capa)
{
sess_t* tmp;
mio_oow_t newcapa;
newcapa = marc->sess.capa + 16;
if (newcapa <= sid) newcapa = sid + 1;
newcapa = MIO_ALIGN_POW2(newcapa, 16);
tmp = mio_reallocmem(mio, marc->sess.ptr, MIO_SIZEOF(sess_t) * newcapa);
if (MIO_UNLIKELY(!tmp)) return MIO_NULL;
MIO_MEMSET (&marc->sess.ptr[marc->sess.capa], 0, MIO_SIZEOF(sess_t) * (newcapa - marc->sess.capa));
marc->sess.ptr = tmp;
marc->sess.capa = newcapa;
}
sess = &marc->sess.ptr[sid];
if (!sess->dev)
{
sess_qry_t* sq;
sq = make_session_query(mio, "", 0, MIO_NULL); /* this is a place holder */
if (MIO_UNLIKELY(!sq)) return MIO_NULL;
sess->dev = alloc_device(marc);
if (MIO_UNLIKELY(!sess->dev))
{
free_session_query (mio, sq);
return MIO_NULL;
}
sess->q_head = sess->q_tail = sq;
}
return sess;
}
int mio_svc_mar_querywithbchars (mio_svc_marc_t* marc, int sid, const mio_bch_t* qptr, mio_oow_t qlen, void* qctx)
{
mio_t* mio = marc->mio;
sess_t* sess;
sess = get_session(marc, sid);
if (MIO_UNLIKELY(!sess)) return -1;
if (!sess->q_head)
{
/* the first query for the device */
sess_qry_t* sq;
sq = make_session_query(mio, qptr, qlen, qctx);
if (MIO_UNLIKELY(!sq)) return -1;
sess->q_head = sq;
sess->q_tail = sq;
/* what if it's not connected??? */
if (mio_dev_mar_querywithbchars(sess->dev, qptr, qlen) <= -1)
{
sess->q_head = MIO_NULL;
sess->q_tail = MIO_NULL;
free_session_query (mio, sq);
return -1; /* TODO: need a context pointer */
}
}
else
{
/* there is an ongoing query for the device */
sess_qry_t* sq;
sq = make_session_query(mio, qptr, qlen, qctx);
if (MIO_UNLIKELY(!sq)) return -1;
/* push it at the back */
sess->q_tail->sq_next = sq;
sess->q_tail = sq;
}
#if 0 #if 0
dev = alloc_device(marc); dev = get_session(marc, sid);
if (!dev) if (!dev)
{ {
}
}
if (mio_dev_mar_querywithbchars(dev, qptr, qlen) <= -1) return -1; /* TODO: need a context pointer */ if (mio_dev_mar_querywithbchars(dev, qptr, qlen) <= -1) return -1; /* TODO: need a context pointer */
#endif #endif
} }
#if 0
mio_svc_mar_querywithbchars (1, "select...");
for (each row)
{
mio_svc_mar_querywithbchars (2, "xxxxxx");
}
#endif