From e0fa12757aad1352af15644bad9892ddbb1a7ed0 Mon Sep 17 00:00:00 2001 From: adam Date: Sat, 20 Jul 2013 18:49:19 +0700 Subject: [PATCH] #84 +more reliable way to iterate over collumns under global read lock --- tcejdb/ejdb.c | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/tcejdb/ejdb.c b/tcejdb/ejdb.c index a295270..5460fad 100644 --- a/tcejdb/ejdb.c +++ b/tcejdb/ejdb.c @@ -547,16 +547,16 @@ EJQRESULT ejdbqryexecute(EJCOLL *jcoll, const EJQ *q, uint32_t *count, int qflag _ejdbsetecode(jcoll->jb, TCEINVALID, __FILE__, __LINE__, __func__); return NULL; } - JBCLOCKMETHOD(jcoll, (q->flags & EJQUPDATING) ? true : false); - _ejdbsetecode(jcoll->jb, TCESUCCESS, __FILE__, __LINE__, __func__); - if (ejdbecode(jcoll->jb) != TCESUCCESS) { //we are not in fatal state - JBCUNLOCKMETHOD(jcoll); - return NULL; - } - TCLIST *res = _qryexecute(jcoll, q, count, qflags, log); + JBCLOCKMETHOD(jcoll, (q->flags & EJQUPDATING) ? true : false); + _ejdbsetecode(jcoll->jb, TCESUCCESS, __FILE__, __LINE__, __func__); + if (ejdbecode(jcoll->jb) != TCESUCCESS) { //we are not in fatal state JBCUNLOCKMETHOD(jcoll); - return res; + return NULL; } + TCLIST *res = _qryexecute(jcoll, q, count, qflags, log); + JBCUNLOCKMETHOD(jcoll); + return res; +} int ejdbqresultnum(EJQRESULT qr) { return qr ? tclistnum(qr) : 0; @@ -779,21 +779,15 @@ bool ejdbexport(EJDB *jb, const char *path, TCLIST *cnames, int flags, TCXSTR *l return false; } } + JBENSUREOPENLOCK(jb, false, false); TCLIST *_cnames = cnames; if (_cnames == NULL) { - TCLIST *colls = ejdbgetcolls(jb); - if (colls == NULL) { - _ejdbsetecode2(jb, TCEINVALID, __FILE__, __LINE__, __func__, true); - return false; - } - _cnames = tclistnew2(TCLISTNUM(colls)); - for (int i = 0; i < TCLISTNUM(colls); ++i) { - EJCOLL *c = TCLISTVALPTR(colls, i); + _cnames = tclistnew2(jb->cdbsnum); + for (int i = 0; i < jb->cdbsnum; ++i) { + EJCOLL *c = jb->cdbs[i]; TCLISTPUSH(_cnames, c->cname, c->cnamesz); } - tclistdel(colls); } - JBENSUREOPENLOCK(jb, false, false); for (int i = 0; i < TCLISTNUM(_cnames); ++i) { const char *cn = TCLISTVALPTR(_cnames, i); assert(cn); -- 2.7.4