程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 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的博客”

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved