From 36462a8b3c17fef7503c2d39cbbf0b5f3876297d Mon Sep 17 00:00:00 2001 From: deffpuzzl Date: Fri, 22 Jun 2018 18:18:00 +0800 Subject: [PATCH] Enhanced mount table --- README.MD | 37 ++++++++++++++++++------------------- src/tree.c | 26 ++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 21 deletions(-) diff --git a/README.MD b/README.MD index 4fb83ca..ced56af 100644 --- a/README.MD +++ b/README.MD @@ -18,13 +18,13 @@ STVM(truck of Virtual memory table)是一个开源的使用ANSI C语言编 ***使用须知*** * 表空间大小在创建时已经确定, 一旦创建不能随意修改大小。 * 多机集群无法使用事务。 -* 数据无法持久化(宕机情况)。 +* 数据无法持久化(宕机情况), 可以定时利用接口备份。 * 索引长度限制(默认64字节),修改需编译项目。 * 启动后不能修改表字段,但可以修改字段别名 建议使用场景:***数据库缓存、数据缓存、事件驱动*** -不定时更新 https://my.oschina.net/deffpuzzl/blog/1627626 +不定时更新 https://my.oschina.net/deffpuzzl/blog/1627626 ## 1、编译 **编译项目** @@ -46,17 +46,20 @@ cd src目录 **./make** * **TVMCFG=$(TVMDBD)/.tvm.run** 启动参数 使用方法: -如果不使用多机集群,无需配置域文件,缺省本地启动。 +如果不使用多机集群,无需配置域文件,缺省本地启动(该版本对集群支持较弱, 时间有限,稍后更新,请悉知)。 -启动系统 +启动系统 > stvm -w -停止系统 -> stvm -s +停止系统 +> stvm -s STVM也提供一个类型sqlpuls类型简单工具。 -进入SQL界面, 该工具主要用来运维调试使用 -> stvm SQL +进入SQL界面, 该工具主要用来运维调试使用,其中showmode显示模式ROW|COLUMN,showsize单次显示记录数,也可用封装该指令的脚本**msql**进入 +> stvm SQL --showmode=row --showsize=8 + +批量执行M-SQL脚本**exsql**,也可直接执行 +>stvm SQL --msql=msql.bat 域的维护 > stvm DOM @@ -67,7 +70,7 @@ STVM也提供一个类型sqlpuls类型简单工具。 配置域完成后,可以配置编译到$TVMCFG下 > stvm -c stvm.conf -然后在stvm -w启动即可 +然后在 **stvm -w** 启动即可 建议以单机模式64位下运行,将性能发挥在极致。 @@ -116,19 +119,15 @@ STVM也提供一个类型sqlpuls类型简单工具。 >* 1、新增queue网络同步异步接口 >* 1、新增将表中长时间无用数据导出备份接口 +队列的创建与表类似: +队列不支持创建索引,队列创建有2种类型,基于表队列和字符串队列,详见API。 +创建队列语法示例: +在M-SQL中执行 create que_user_info.def + + **下本版本:** * 1、新增多机资源共享方式。 * 2、JAVA接口开发 **不定时更新** - - - - ---- -#### *常见错误集合* #### -``` -Q、failed to boot TVM, Invalid parameter or sem has disappeared -A:echo "500 X X X" > /proc/sys/kernel/sem -``` diff --git a/src/tree.c b/src/tree.c index f2e6446..fc65d33 100644 --- a/src/tree.c +++ b/src/tree.c @@ -11116,6 +11116,7 @@ long lDumpTable(SATvm *pstSavm, TABLE t) return RC_FAIL; } fwrite(pGetTblDef(t), sizeof(TblDef), 1, fp); + fwrite(&pstRun->m_lType, sizeof(pstRun->m_lType), 1, fp); pstSavm->lSize = lGetRowSize(t); if(TYPE_MQUEUE == pstRun->m_lType) @@ -11142,12 +11143,13 @@ long lDumpTable(SATvm *pstSavm, TABLE t) long lMountTable(SATvm *pstSavm, char *pszFile) { TblDef sf; + uint lType; FILE *fp = NULL; + ulong uTimes = 0; long lEffect = 0; void *pvData = NULL; RunTime *pstRun = NULL; RWLock *prwLock = NULL; - ulong uTimes = 0, lRet; if(!pszFile || !pstSavm || !strlen(pszFile)) { @@ -11162,12 +11164,31 @@ long lMountTable(SATvm *pstSavm, char *pszFile) } fread(&sf, sizeof(TblDef), 1, fp); + fread(&lType, sizeof(lType), 1, fp); if(RC_SUCC != lInitSATvm(pstSavm, sf.m_table)) - goto MOUNT_ERROR; + { + if(pstSavm->m_lErrno != TBL_NOT_FOUND) + goto MOUNT_ERROR; + sf.m_lGroup = 0; + sf.m_lValid = 0; + sf.m_lTreePos = 0; + sf.m_lTreeRoot = 0; + sf.m_lGroupPos = 0; + sf.m_lGroupRoot= 0; + sf.m_lListPos = 0; + sf.m_lListOfs = 0; + memcpy((void *)pGetTblDef(sf.m_table), (void *)&sf, sizeof(TblDef)); + if(RC_SUCC != _lCustomTable(pstSavm, sf.m_table, sf.m_lMaxRow, false, lType)) + goto MOUNT_ERROR; + } + if(NULL == (pstRun = (RunTime *)pInitHitTest(pstSavm, sf.m_table))) goto MOUNT_ERROR; + pstRun->m_lType = lType; + pstRun->m_lRowSize = sf.m_lReSize; + pstRun->m_lLocal = RES_LOCAL_SID; if(sf.m_lReSize != lGetRowSize(sf.m_table)) { vTblDisconnect(pstSavm, pstSavm->tblName); @@ -11183,6 +11204,7 @@ long lMountTable(SATvm *pstSavm, char *pszFile) } pstSavm->pstVoid = pvData; + pstSavm->tblName = sf.m_table; pstSavm->lSize = sf.m_lReSize; prwLock = (RWLock *)pGetRWLock(pstRun->m_pvAddr); if(RC_SUCC != pthread_rwlock_wrlock(prwLock))