diff --git a/demo/count b/demo/count index a02c6de..d766fd9 100755 Binary files a/demo/count and b/demo/count differ diff --git a/demo/delete b/demo/delete index 1e8927a..cb71b21 100755 Binary files a/demo/delete and b/demo/delete differ diff --git a/demo/drop b/demo/drop index 9247447..32e443a 100755 Binary files a/demo/drop and b/demo/drop differ diff --git a/demo/extreme b/demo/extreme index 9ea0ab6..dc8f6c3 100755 Binary files a/demo/extreme and b/demo/extreme differ diff --git a/demo/group b/demo/group index ac92316..195326b 100755 Binary files a/demo/group and b/demo/group differ diff --git a/demo/insert b/demo/insert index 5526d3f..82964cf 100755 Binary files a/demo/insert and b/demo/insert differ diff --git a/demo/insert.c b/demo/insert.c index 0e0bfdb..b79c807 100644 --- a/demo/insert.c +++ b/demo/insert.c @@ -1,7 +1,7 @@ #include "tvm.h" #include "tmain.h" -#define TBL_USER_INFO 20 +#define TBL_USER_INFO 21 typedef struct __TBL_USER_INFO { diff --git a/demo/press_demo b/demo/press_demo index 3a60ddd..1f14637 100755 Binary files a/demo/press_demo and b/demo/press_demo differ diff --git a/demo/query b/demo/query index 201eec1..2596184 100755 Binary files a/demo/query and b/demo/query differ diff --git a/demo/select b/demo/select index c7e1b22..b65922a 100755 Binary files a/demo/select and b/demo/select differ diff --git a/demo/truncate b/demo/truncate index c584b47..6853fb2 100755 Binary files a/demo/truncate and b/demo/truncate differ diff --git a/demo/update b/demo/update index bec573c..4484e8c 100755 Binary files a/demo/update and b/demo/update differ diff --git a/include/tstr.h b/include/tstr.h index 998d9de..09c8bd7 100644 --- a/include/tstr.h +++ b/include/tstr.h @@ -30,7 +30,6 @@ #include #include #include -#include #include #include #include diff --git a/include/tvm.h b/include/tvm.h index ce0a503..c43c480 100644 --- a/include/tvm.h +++ b/include/tvm.h @@ -54,7 +54,6 @@ typedef long CREATE; #define QUE_NOWAIT 1 #define QUE_NORMAL 0 - // execution plan #define EXE_PLAN_ALL 0 #define EXE_PLAN_IDX 1 diff --git a/src/queue.c b/src/queue.c index 2c89db7..e789e06 100644 --- a/src/queue.c +++ b/src/queue.c @@ -80,20 +80,29 @@ long _lPush(SATvm *pstSavm, void *pvAddr) RC_SUCC --success RC_FAIL --failure *************************************************************************************************/ -long _lPopup(SATvm *pstSavm, void *pvAddr, void *pvOut, Timesp *tm) +long _lPop(SATvm *pstSavm, void *pvAddr, void *pvOut, Timesp *tm) { - int nPos, lRet; + int nPos; SHTruck *ps = NULL; + extern int errno; TblDef *pv = (TblDef *)pvAddr; - errno = 0; while(1) { - Futex(&pv->m_lValid, FUTEX_WAIT, 0, tm); - if(EWOULDBLOCK != errno && 0 != errno) + if(0 != Futex(&pv->m_lValid, FUTEX_WAIT, 0, tm)) { - pstSavm->m_lErrno = MQUE_WAIT_ERR; - return RC_FAIL; + if(ETIMEDOUT == errno) // timeout + { + pstSavm->m_lErrno = NO_DATA_FOUND; + return RC_FAIL; + } + else if(EWOULDBLOCK != errno) + { + pstSavm->m_lErrno = MQUE_WAIT_ERR; + return RC_FAIL; + } + else // EWOULDBLOCK + ; } if(0 == pv->m_lValid) @@ -146,6 +155,7 @@ long _lPops(SATvm *pstSavm, void *pvAddr, size_t lExpect, Timesp *tm, size_t { int nPos; SHTruck *ps = NULL; + extern int errno; TblDef *pv = (TblDef *)pvAddr; if(NULL == (*ppsvOut = (char *)malloc(lExpect * pv->m_lReSize))) @@ -154,24 +164,28 @@ long _lPops(SATvm *pstSavm, void *pvAddr, size_t lExpect, Timesp *tm, size_t return RC_FAIL; } - for (*plOut = 0; 0 < lExpect; --lExpect) + for (*plOut = 0; *plOut < lExpect; ) { if(0 != Futex(&pv->m_lValid, FUTEX_WAIT, 0, tm)) { - if(EWOULDBLOCK == errno) + if(ETIMEDOUT == errno) { - if(0 == *plOut) - { - pstSavm->m_lErrno = NO_DATA_FOUND; - TFree(*ppsvOut); - } - else - pstSavm->m_lErrno = MQUE_WAIT_TMO; - return RC_SUCC; + if(0 == *plOut) + { + TFree(*ppsvOut); + pstSavm->m_lErrno = NO_DATA_FOUND; + } + else + pstSavm->m_lErrno = MQUE_WAIT_TMO; + return RC_FAIL; } - - pstSavm->m_lErrno = MQUE_WAIT_ERR; - return RC_FAIL; + else if(EWOULDBLOCK != errno) + { + pstSavm->m_lErrno = MQUE_WAIT_ERR; + return RC_FAIL; + } + else // EWOULDBLOCK + ; } if(0 == pv->m_lValid) @@ -246,9 +260,9 @@ long lPop(SATvm *pstSavm, void *pvOut, Uenum eWait) } if(QUE_NOWAIT == eWait) - lRet = _lPopup(pstSavm, pstRun->m_pvAddr, pvOut, &tm); + lRet = _lPop(pstSavm, pstRun->m_pvAddr, pvOut, &tm); else - lRet = _lPopup(pstSavm, pstRun->m_pvAddr, pvOut, NULL); + lRet = _lPop(pstSavm, pstRun->m_pvAddr, pvOut, NULL); vTblDisconnect(pstSavm, pstSavm->tblName); return lRet; } diff --git a/src/tree.c b/src/tree.c index c4061ff..7c157c2 100644 --- a/src/tree.c +++ b/src/tree.c @@ -5116,6 +5116,21 @@ long lTruncate(SATvm *pstSavm, TABLE t) return RC_FAIL; } + if(TYPE_MQUEUE == pstRun->m_lType) + { + pstSavm->m_lEffect = ((TblDef *)pstRun->m_pvAddr)->m_lValid; + pvData = (void *)pGetNode(pstRun->m_pvAddr, lGetTblData(t)); + memset(pvData, 0, lGetTableSize(t) - lGetTblData(t)); + ((TblDef *)pstRun->m_pvAddr)->m_lGroup = 0; + ((TblDef *)pstRun->m_pvAddr)->m_lValid = 0; + ((TblDef *)pstRun->m_pvAddr)->m_lListPos = 0; + ((TblDef *)pstRun->m_pvAddr)->m_lListOfs = 0; + + pthread_rwlock_unlock(prwLock); + vTblDisconnect(pstSavm, t); + return RC_SUCC; + } + if(RC_SUCC != lInitailTree(pstSavm, (void *)pGetNode(pstRun->m_pvAddr, lGetIdxPos(t)), t)) { pthread_rwlock_unlock(prwLock); @@ -9129,7 +9144,6 @@ long lImportFile(TABLE t, char *pszFile, char *pszFlag) memcpy(pvData, szLine, lGetRowSize(t)); else _lImportContext(szLine, lGetFldNum(t), pGetTblKey(t), pvData, pszFlag); - if(RC_SUCC != __lInsert(pstSavm, pstRun, pstSavm->tblName, 0)) break; @@ -9478,9 +9492,6 @@ long lRenameTable(SATvm *pstSavm, TABLE to, TABLE tn) vTblDisconnect(pstSavm, pstSavm->tblName); memset((void *)pGetRunTime(pstSavm, to), 0, sizeof(RunTime)); - if(TYPE_MQUEUE == pstRun->m_lType) - return RC_SUCC; - if(RC_SUCC != lInitSATvm(pstSavm, SYS_TVM_FIELD)) return RC_FAIL; @@ -9488,7 +9499,13 @@ long lRenameTable(SATvm *pstSavm, TABLE to, TABLE tn) conditinit(pstSavm, stField, SYS_TVM_FIELD); conditnum(pstSavm, stField, m_table, to); updatenum(pstSavm, stNFld, m_table, tn); - return lUpdate(pstSavm, &stNFld); + if(RC_SUCC != lUpdate(pstSavm, &stNFld)) + { + if(NO_DATA_FOUND != pstSavm->m_lErrno) + return RC_FAIL; + } + + return RC_SUCC; } /************************************************************************************************* @@ -11040,7 +11057,6 @@ long lMountTable(SATvm *pstSavm, char *pszFile) } lEffect ++; - if(RC_SUCC != __lInsert(pstSavm, pstRun, pstSavm->tblName, uTimes)) { fprintf(stderr, "=>警告, 导入表:%s 第(%ld)条记录错误, %s, 跳过..\n",