Skip to content

Commit dd23a03

Browse files
committed
updated binary
1 parent ee776be commit dd23a03

File tree

7 files changed

+123
-7
lines changed

7 files changed

+123
-7
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
build/*
33
.svn*
44
*.node
5+
*.log

examples/get-stress.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ function client() {
135135
};
136136

137137
connection.parser.onHeader = function(header) {
138+
//console.log(connection.parser.current);
138139
connection.current = {"header": header};
139140
if(connection.parser.chunked && header.bodylen > 0) {
140141
connection.current.body = [];
@@ -164,7 +165,7 @@ function client() {
164165
connection.end();
165166
});
166167

167-
connection.connect("/tmp/qsrv.1.sock");
168+
connection.connect("/tmp/memcached.sock");
168169
}
169170

170171
for(var i=0; i<numclients; i++) {

examples/testclient.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ var value = "hello";
4040
{"method": "flushq", "params":"expiration, cb"}
4141
*/
4242

43-
client.connect("/tmp/qsrv.1.sock", null, function() {
43+
client.connect("/tmp/memcached.sock", null, function() {
4444
sys.puts("connected");
4545
client.flush(null, function(message) {
4646
sys.puts("FLUSH: " + (message.header.status == memc.constants.status.NO_ERROR?"OK":"FAIL"));

install-linux.sh

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
cp lib/* /usr/local/lib/node/

lib/binary.js

+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
function Binary() {
2+
}
3+
4+
var int_sym = "int";
5+
var int16_sym = "int16";
6+
var int32_sym = "int32";
7+
var string_sym = "string";
8+
9+
Binary.prototype.pack = function(fields, buff, offset) {
10+
var e = fields.length + 1;
11+
var i = offset;
12+
var next = 0;
13+
while(--e) {
14+
var field = fields[next++];
15+
if(string_sym in field) {
16+
buff.asciiWrite(field.string, i);
17+
i += field.string.length;
18+
}
19+
else if(int_sym in field) {
20+
buff[i++] = field.int & 0xff;
21+
}
22+
else if(int16_sym in field) {
23+
buff[i++] = (field.int16 >> 8) & 0xff;
24+
buff[i++] = field.int16 & 0xff;
25+
}
26+
else if(int32_sym in field) {
27+
buff[i++] = (field.int32 >> 24) & 0xff;
28+
buff[i++] = (field.int32 >> 16) & 0xff;
29+
buff[i++] = (field.int32 >> 8) & 0xff;
30+
buff[i++] = field.int32 & 0xff;
31+
}
32+
}
33+
return (i - offset);
34+
}
35+
36+
Binary.prototype.unpack = function(pattern, offset, buff) {
37+
var len = pattern.length;
38+
var i = offset;
39+
var pi = 0;
40+
var res = [];
41+
while(pi < len) {
42+
switch(pattern[pi]) {
43+
case "N":
44+
res.push((buff[i++] << 24) + (buff[i++] << 16) + (buff[i++] << 8) + buff[i++]);
45+
pi++;
46+
break;
47+
case "n":
48+
res.push((buff[i++] << 8) + buff[i++]);
49+
pi++;
50+
break;
51+
case "o":
52+
res.push(buff[i++]);
53+
pi++;
54+
break;
55+
case "s":
56+
case "a":
57+
var slen = 1;
58+
var tmp = 0;
59+
while(true) {
60+
tmp = pattern[pi + slen];
61+
if(!(tmp >= "0" && tmp <= "9")) {
62+
break;
63+
}
64+
slen++;
65+
}
66+
var strlen = parseInt(pattern.substring(pi + 1, pi + slen));
67+
res.push(buff.asciiSlice(i, i+strlen));
68+
i += strlen;
69+
pi += slen;
70+
break;
71+
case "u":
72+
break;
73+
}
74+
}
75+
return res;
76+
}
77+
78+
exports.Binary = Binary;

lib/client.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
var binary = require("binary");
1+
var binary = require("binary.node");
22
var memc = require("./parser");
33
var net = require("net");
44
var sys = require("sys");

lib/parser.js

+39-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
var binary = require("binary");
1+
var binary = require("binary.node");
22
var bin = new binary.Binary();
33

44
var constants = {
@@ -29,7 +29,29 @@ var constants = {
2929
"QUITQ": 0x17,
3030
"FLUSHQ": 0x18,
3131
"APPENDQ": 0x19,
32-
"PREPENDQ": 0x1A
32+
"PREPENDQ": 0x1A,
33+
"SASLLIST": 0x20,
34+
"SASLAUTH": 0x21,
35+
"SASLSTEP": 0x22,
36+
"RGET": 0x30,
37+
"RSET": 0x31,
38+
"RSETQ": 0x32,
39+
"RAPPEND": 0x33,
40+
"RAPPENDQ": 0x34,
41+
"RPREPEND": 0x35,
42+
"RPREPENDQ": 0x36,
43+
"RDELETE": 0x37,
44+
"RDELETEQ": 0x38,
45+
"RINCR": 0x39,
46+
"RINCRQ": 0x3a,
47+
"RDECR": 0x3b,
48+
"RDECRQ": 0x3c,
49+
"TAPCONN": 0x40,
50+
"TAPMUTATE": 0x41,
51+
"TAPDELETE": 0x42,
52+
"TAPFLUSH": 0x43,
53+
"TAPOPAQUE": 0x44,
54+
"TAPBUCKETSET": 0x45
3355
},
3456
"encodings": {
3557
"BINARY": 0,
@@ -60,8 +82,15 @@ var constants = {
6082
"INVALID_ARGUMENTS": 0x04,
6183
"ITEM_NOT_STORED": 0x05,
6284
"INCR_DECR_NON_NUMERIC": 0x06,
85+
"VBUCKET_WRONG_SERVER": 0x07,
86+
"AUTH_ERROR": 0x08,
87+
"AUTH_CONTINUE": 0x09,
6388
"UNKNOWN_COMMAND": 0x81,
64-
"OUT_OF_MEMORY": 0x82
89+
"OUT_OF_MEMORY": 0x82,
90+
"NOT_SUPPORTED": 0x83,
91+
"INTERNAL_ERROR": 0x84,
92+
"BUSY": 0x85,
93+
"TEMPORARY_FAILURE": 0x86
6594
}
6695
};
6796

@@ -124,7 +153,13 @@ function Parser(options) {
124153
message.header.keylen = obj[2];
125154
message.header.exlen = obj[3];
126155
message.header.datatype = obj[4];
127-
message.header.status = obj[5];
156+
if(message.header.magic == constants.general.MAGIC.request) {
157+
// new protocol - http://code.google.com/p/memcached/wiki/BinaryProtocolRevamped
158+
message.header.vbucket = obj[5];
159+
}
160+
else {
161+
message.header.status = obj[5];
162+
}
128163
message.header.totlen = obj[6];
129164
message.header.opaque = obj[7];
130165
message.header.cashi = obj[8];

0 commit comments

Comments
 (0)