redis-lua.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. var createHash = require('crypto').createHash,
  2. _ = require('lodash'),
  3. sha = function(str) {return createHash('sha1').update(str).digest('hex');};
  4. function keyval(cb) {
  5. return function(err, res) {
  6. var hash = {}, i, key, val;
  7. if (err) {
  8. cb(err);
  9. } else if (res.length % 2 !== 0) {
  10. cb('result length not even');
  11. } else {
  12. for (i = 0; i < res.length; i += 2) {
  13. key = res[i].toString();
  14. val = res[i + 1];
  15. hash[key] = val;
  16. }
  17. cb(null, hash);
  18. }
  19. };
  20. }
  21. exports.attachLua = function(redis) {
  22. /**
  23. * redis.lua( SCRIPTNAME , SCRIPT_PLAINTEXT, [keyed]);
  24. * @param {String} name Script name
  25. * @param {String} script Script string
  26. * @param {[type]} keyed [description]
  27. * @chainable
  28. * @return {Redis}
  29. */
  30. redis.lua = function(name, script, keyed) {
  31. var script_sha = null;
  32. redis.RedisClient.prototype[name] = function(){
  33. var cb = function(){}, self = this, params;
  34. params = [].slice.call(arguments);
  35. if (params.length > 0 && typeof params[params.length - 1] == 'function') {
  36. cb = params.pop();
  37. }
  38. if(!_.isArray(params)){
  39. params = [params];
  40. }
  41. params = _.flatten(params);
  42. params.unshift(script);
  43. if(keyed){
  44. cb = keyval(cb);
  45. }
  46. params.push(cb);
  47. // node_redis now support eval
  48. // https://github.com/mranney/node_redis/blob/master/index.js#L1067
  49. this.eval.apply(this, params);
  50. };
  51. return this;
  52. };
  53. return redis;
  54. };