Comparing version 0.2.0 to 0.2.1
@@ -8,2 +8,4 @@ # Authors and contributors of the node Memcached driver project in alphabetical order. | ||
- Jan Krems | ||
- Jason Pearlman | ||
- Joseph Mordetsky | ||
- Near Privman | ||
@@ -10,0 +12,0 @@ - Nebojsa Sabovic |
@@ -74,3 +74,4 @@ "use strict"; | ||
, maxValue: 1048576 // max length of value allowed by Memcached | ||
, activeQueries: 0 | ||
, maxQueueSize: -1 | ||
, algorithm: 'crc32' // hashing algorithm that is used for key mapping | ||
@@ -109,3 +110,3 @@ | ||
if (server in this.issues && this.issues[server].failed) { | ||
return callback(false, false); | ||
return callback(false, false); | ||
} | ||
@@ -215,2 +216,3 @@ | ||
while (i--) { | ||
//memcached.delegateCallback(this, servers[i], map[servers[i]], i, servers.length, callback); | ||
callback.call(this, servers[i], map[servers[i]], i, servers.length); | ||
@@ -223,5 +225,14 @@ } | ||
memcached.command = function memcachedCommand(queryCompiler, server) { | ||
// generate a regular query, | ||
var query = queryCompiler() | ||
, redundancy = this.redundancy && this.redundancy < this.servers.length | ||
this.activeQueries++; | ||
var query = queryCompiler(); | ||
if (this.activeQueries> this.maxQueueSize && this.maxQueueSize > 0){ | ||
this.makeCallback(query.callback, "over queue limit", null); | ||
query = null; | ||
return; | ||
} | ||
// generate a regular query, | ||
var redundancy = this.redundancy && this.redundancy < this.servers.length | ||
, queryRedundancy = query.redundancyEnabled | ||
@@ -231,3 +242,6 @@ , memcached = this; | ||
// validate the arguments | ||
if (query.validate && !Utils.validateArg(query, this)) return; | ||
if (query.validate && !Utils.validateArg(query, this)) { | ||
this.activeQueries--; | ||
return; | ||
} | ||
@@ -252,3 +266,3 @@ // try to find the correct server for this query | ||
if (server in this.issues && this.issues[server].failed) { | ||
return query.callback && query.callback(new Error('Server not available')); | ||
return query.callback && memcached.makeCallback(query.callback,new Error('Server not available')); | ||
} | ||
@@ -264,7 +278,7 @@ | ||
// check for issues | ||
if (error) return query.callback && query.callback(error); | ||
if (!S) return query.callback && query.callback(new Error('Connect did not give a server')); | ||
if (error) return query.callback && memcached.makeCallback(query.callback,error); | ||
if (!S) return query.callback && memcached.makeCallback(query.callback,new Error('Connect did not give a server')); | ||
if (S.readyState !== 'open') { | ||
return query.callback && query.callback(new Error('Connection readyState is set to ' + S.readySate)); | ||
return query.callback && memcached.makeCallback(query.callback,new Error('Connection readyState is set to ' + S.readySate)); | ||
} | ||
@@ -287,3 +301,5 @@ | ||
redundancy.forEach(function each(server) { | ||
if (server in memcached.issues && memcached.issues[server].failed) return; | ||
if (server in memcached.issues && memcached.issues[server].failed){ | ||
return; | ||
} | ||
@@ -594,2 +610,16 @@ memcached.connect(server, function allocateMemcachedConnection(error, S) { | ||
memcached.delegateCallback = function(){ | ||
this.activeQueries--; | ||
var master = arguments[0]; | ||
var cb = arguments[arguments.length-1]; | ||
var args = Array.prototype.slice.call(arguments, 1, arguments.length-1); | ||
cb.apply(master, args); | ||
}; | ||
memcached.makeCallback = function(cb){ | ||
this.activeQueries--; | ||
var args = Array.prototype.slice.call(arguments, 1); | ||
cb.apply(this, args); //loose first | ||
}; | ||
// The actual parsers function that scan over the responseBuffer in search of | ||
@@ -645,3 +675,3 @@ // Memcached response identifiers. Once we have found one, we will send it to | ||
metaData.execution = Date.now() - metaData.start; | ||
metaData.callback.call( | ||
this.delegateCallback( | ||
metaData | ||
@@ -654,3 +684,4 @@ , err.length ? err : err[0] | ||
: !Array.isArray(queue) || queue.length > 1 ? queue : queue[0] | ||
); | ||
,metaData.callback | ||
); | ||
} | ||
@@ -666,3 +697,3 @@ | ||
metaData.execution = Date.now() - metaData.start; | ||
metaData.callback.call(metaData, err.length > 1 ? err : err[0], resultSet[0]); | ||
this.delegateCallback(metaData, err.length > 1 ? err : err[0], resultSet[0], metaData.callback); | ||
} | ||
@@ -678,3 +709,3 @@ | ||
metaData.execution = Date.now() - metaData.start; | ||
metaData.callback.call(metaData, new Error('Unknown response from the memcached server: "' + token + '"'), false); | ||
this.delegateCallback(metaData, new Error('Unknown response from the memcached server: "' + token + '"'), false, metaData.callback); | ||
} | ||
@@ -694,3 +725,5 @@ } | ||
privates.errorResponse = function errorResponse(error, callback) { | ||
if (typeof callback === 'function') callback(error, false); | ||
if (typeof callback === 'function') { | ||
this.makeCallback(callback,error, false); | ||
} | ||
@@ -747,3 +780,5 @@ return false; | ||
if (!--calls) callback(errors.length ? errors : false, responses); | ||
if (!--calls){ | ||
callback(errors.length ? errors : false, responses); | ||
} | ||
} | ||
@@ -950,3 +985,5 @@ | ||
// multi calls should ALWAYS return an array! | ||
if (!--calls) callback(errors && errors.length ? errors.pop() : undefined, responses); | ||
if (!--calls) { | ||
callback(errors && errors.length ? errors.pop() : undefined, responses ) | ||
} | ||
} | ||
@@ -953,0 +990,0 @@ |
@@ -7,4 +7,3 @@ "use strict"; | ||
exports.validateArg = function validateArg (args, config) { | ||
var err | ||
, callback; | ||
var err; | ||
@@ -62,3 +61,3 @@ args.validate.forEach(function (tokens) { | ||
// also make sure you update the command | ||
args.command.replace(value, args[key]); | ||
args.command = args.command.replace(value, args[key]); | ||
} else { | ||
@@ -81,3 +80,3 @@ err = 'Argument "' + key + '" is longer than the maximum allowed length of ' + config.maxKeySize; | ||
if (err){ | ||
if(callback) callback(err, false); | ||
if(args.callback) args.callback(new Error(err)); | ||
return false; | ||
@@ -84,0 +83,0 @@ } |
{ | ||
"name": "memcached" | ||
, "version": "0.2.0" | ||
, "version": "0.2.1" | ||
, "author": "Arnout Kazemier" | ||
@@ -5,0 +5,0 @@ , "description": "A fully featured Memcached API client, supporting both single and clustered Memcached servers through consistent hashing and failover/failure. Memcached is rewrite of nMemcached, which will be deprecated in the near future." |
@@ -541,2 +541,51 @@ /** | ||
}); | ||
/** | ||
* Make sure long keys are hashed | ||
*/ | ||
it("make sure you can get really long strings", function(done) { | ||
var memcached = new Memcached(common.servers.single) | ||
, message = 'VALUE hello, I\'m not really a value.' | ||
, testnr = "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"+(++global.testnumbers) | ||
, callbacks = 0; | ||
memcached.set("test:" + testnr, message, 1000, function(error, ok){ | ||
++callbacks; | ||
assert.ok(!error); | ||
ok.should.be.true; | ||
memcached.get("test:" + testnr, function(error, answer){ | ||
++callbacks; | ||
assert.ok(!error); | ||
assert.ok(typeof answer === 'string'); | ||
answer.should.eql(message); | ||
memcached.end(); // close connections | ||
assert.equal(callbacks, 2); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
/** | ||
* Make sure keys with spaces return an error | ||
*/ | ||
it("errors on spaces in strings", function(done) { | ||
var memcached = new Memcached(common.servers.single) | ||
, message = 'VALUE hello, I\'m not really a value.' | ||
, testnr = " "+(++global.testnumbers) | ||
, callbacks = 0; | ||
memcached.set("test:" + testnr, message, 1000, function(error, ok){ | ||
++callbacks; | ||
assert.ok(error); | ||
assert.ok(error.message == 'The key should not contain any whitespace or new lines') | ||
done(); | ||
}); | ||
}); | ||
}); |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
441782
63
2461