如今咱們開始分析具體的處理函數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]);
}
}
將解析結果保存起來。
至此,本函數執行完畢。