Redis源碼分析系列十五:processInlineBuffer

如今咱們開始分析具體的處理函數processInlineBuffer。 c++

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ redis

char *newline = strstr(c->querybuf,"\r\n"); 數組

//查找第一個\r\n的位置 數據結構



int argc;
int j;
//設置兩個整型變量


sds *argv;

sds aux;
////將querylen長度的字符串從新初始化成一個sds數據結構體
size_t querylen;
//當前查找\r\n後的長度

//設置若干變量

/* Nothing to do without a \r\n */
if (newline == NULL) 
{
if (sdslen(c->querybuf) > REDIS_INLINE_MAX_SIZE) {
addReplyError(c,"Protocol error: too big inline request");
setProtocolError(c,0);
}
return REDIS_ERR;
}
//若是沒有找到\r\n,則返回


/* Split the input buffer up to the \r\n */
querylen = newline-(c->querybuf);
//設置爲查詢到的長度


aux = sdsnewlen(c->querybuf,querylen);
//將querylen長度的字符串從新初始化成一個sds數據結構體 函數

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ token

而後後面的函數是:sdssplitargs 字符串

從字面來理解的話,應該是以某個字符串爲分割,結果是返回一個數組。 input

咱們跟進去一窺奧義。 it

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 變量

我稍微看了下這個函數的代碼,沒有百分百弄清楚,

我看了下

/* add the token to the vector */
vector = zrealloc(vector,((*argc)+1)*sizeof(char*));

vector[*argc] = current;

(*argc)++;
而後知道這個函數的做用是:將這個字符串解析下,分割成若干個字符串數組

vector的每一個成員是一個字符串首地址,argc返回字符串的個數,而後就返回了,

如今的問題是,如何解析字符串,返回的是什麼樣的形式呢?

下面是個人理解:

1:在雙引號中,

1.1  \xab十六進制形式的,轉換成一個數字。

1.2 "\n"--->'\n'

1.3 "\r"--->'\r"
1.4"\t"--->'\t'

1.5 "\b"--->'\b'

1.6 "\a"--->'\a'

1.7其它字符,複製進去。

2:在單引號中

2.1 "\'"--->'\''

2.2 其它字符,複製進去。

~~~~~~~~~~~~~~~~~~~~~~~~~~

 而後咱們回到processInlineBuffer函數。

下面的代碼,咱們來關注sdsrange(c->querybuf,querylen+2,-1);

因爲以前咱們已經處理了一部分字符串,如今要把這個字符串從緩衝區裏撤走。

/* Setup argv array on client structure */
if (c->argv) zfree(c->argv);
 c->argv = zmalloc(sizeof(robj*)*argc);
//釋放已經有的緩衝區,而後根據解析結果來從新分配緩衝區。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* Create redis objects for all arguments. */
for (c->argc = 0, j = 0; j < argc; j++) 
{

if (sdslen(argv[j])) 
{

c->argv[c->argc] = createObject(REDIS_STRING,argv[j]);

c->argc++;


else 
{

sdsfree(argv[j]);

}
}

將解析結果保存起來。

至此,本函數執行完畢。

相關文章
相關標籤/搜索