当前位置:编程学习 > C/C++ >>

C语言实现一种简单的应用服务器内部数据结构的思路(三)

 在上文中实现了最基本key->value的内部接口,也能满足一般的需求了。但这个有一个局限,就是一个key就是对应一个值类型,而平常的应用中,很有可能要保存一组相同的数组,类似数组或者List类型。比如查询类请求就可能会有这种需求,这样就需要对上文的数据结构再做一些扩展,可以加一个type类型来表示

01
<DataDef>
02
    <Field key="cardNo" type="common" length="19"/>
03
    <Field key="amount" type="common" length="13"/>
04
    <Field key="tradeDate" type="common" length="8"/>
05
    <Field key="tradeTime" type="common" length="6"/>
06
    <Field key="listData" type="list" size="3" ref="myListData"/>
07
</DataDef>
08
<ListDataDef name="myListData">
09
    <Field key="listData1" length="19"/>
10
    <Field key="listData2" length="13"/>
11
    <Field key="listData3" length="8"/>
12
    <Field key="listData4" length="6"/>
13
</ListDataDef>
当 type是common时就是普通的对应一个值,当type是list时就表示是一组值,而这组数据的每一个元素类似一个小Map。size表示给这
这组数据分配多少个元素,至于这个元素的定义通过ref与ListDataDef中的name(myListData)关联就知道了,这样就能计算出每个

元素占的空间,与size相乘就得到了key为listData的数据总共的大小。要实现这种方式需要类似二级映射的方法,上文中所说的内存中

的映射关系算第一级映射,先在一级映射中查找这组数据的基础偏移,当type是common那么就找到了,当时list时就通过ref去查找该

list定义的二级映射,那么就可以计算出每一个元素的每一个域的偏移,就可以访问了。

接口定义如下:

1
int getDataList(const void* pDataAddr, const char* szKey, struct DataList* pDataList);
2
 
3
int getDataInList(const void* pDataAddr, const struct DataList* pDataList,int iIdx, const char* szKey, const int iBufLen, char* szValue);
4
int petDataInList(void* pDataAddr, const struct DataList* pDataList, int iIdx, const char* szKey, const char* szValue)
DataList保存必要的List的上下文信息,比如基础偏移,二级映射的地址等,iIdx表示获取数组内的第几组元素,szKey自然表示或者某元素的某个数据的值。

这样,本内部接口的数据支持就比较完整了,应该可以适应大部分的应用。

作者“OneThin的博客”

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,