diff --git a/Cakefile b/Cakefile index 2a02556..de7a976 100644 --- a/Cakefile +++ b/Cakefile @@ -2,7 +2,7 @@ fs = require 'fs' glob = require 'glob' exec = require('child_process').exec -coffee = require 'coffee-script' +coffee = require 'coffeescript' path = require 'path' escapeShell = (arg) -> "'" + arg.replace(/[^\\]'/g, (m, i, s) -> m.slice(0, 1) + "\\'") + "'" diff --git a/bin/cli.js b/bin/cli.js index 378d472..a375527 100644 --- a/bin/cli.js +++ b/bin/cli.js @@ -11,8 +11,9 @@ pkg = JSON.parse(fs.readFileSync(path.normalize(__dirname + '/../package.json'), 'utf8')); + // Display help if requested if (argv.help) { - console.log(pkg.name + " " + pkg.version + "\n\nUsage: redis-dump [OPTIONS]\n -h Server hostname (default: 127.0.0.1)\n -p Server port (default: 6379)\n -d Database number (default: 0)\n -a Password\n -f Query filter (default: *)\n --convert Convert from json to redis commands\n --help Output this help and exit\n --json Output result as json\n --pretty Make pretty indented output (use with --json)\n\nExamples:\n redis-dump\n redis-dump -p 6500\n redis-dump -f 'mydb:*' > mydb.dump.txt\n redis-dump --json > mydb.json\n cat mydb.json | redis-dump --convert\n\nThe output is a valid list of redis commands.\nThat means the following will work:\n redis-dump > dump.txt # Dump redis database\n cat dump.txt | redis-cli # Import redis database from generated file\n"); + console.log(`${pkg.name} ${pkg.version}\n\nUsage: redis-dump [OPTIONS]\n -h Server hostname (default: 127.0.0.1)\n -p Server port (default: 6379)\n -d Database number (default: 0)\n -a Password\n -f Query filter (default: *)\n --convert Convert from json to redis commands\n --help Output this help and exit\n --json Output result as json\n --pretty Make pretty indented output (use with --json)\n\nExamples:\n redis-dump\n redis-dump -p 6500\n redis-dump -f 'mydb:*' > mydb.dump.txt\n redis-dump --json > mydb.json\n cat mydb.json | redis-dump --convert\n\nThe output is a valid list of redis commands.\nThat means the following will work:\n redis-dump > dump.txt # Dump redis database\n cat dump.txt | redis-cli # Import redis database from generated file\n`); } else { params = { filter: (ref = argv.f) != null ? ref : '*', @@ -23,28 +24,31 @@ format: argv.json ? 'json' : 'redis', pretty: (ref5 = argv.pretty) != null ? ref5 : false }; + // Dump operation doDump = function() { return dump(params, function(err, result) { var ref6; if (err != null) { - return process.stderr.write(((ref6 = err.message) != null ? ref6 : err) + "\n"); + return process.stderr.write(`${(ref6 = err.message) != null ? ref6 : err}\n`); } - if ((result != null) && ("" + result).replace(/^\s+/, '').replace(/\s+$/, '') !== '') { + if ((result != null) && `${result}`.replace(/^\s+/, '').replace(/\s+$/, '') !== '') { console.log(result); } return process.exit(0); }); }; + // If we are converting a stream from stdin, read it to the end if (argv.convert) { params.convert = ''; process.stdin.resume(); process.stdin.on('data', function(chunk) { - return params.convert += "" + chunk; + return params.convert += `${chunk}`; }); process.stdin.on('end', function() { return doDump(); }); } else { + // Otherwise just run dump directly doDump(); } } diff --git a/bin/dump.js b/bin/dump.js index ebf0180..0d34b44 100644 --- a/bin/dump.js +++ b/bin/dump.js @@ -1,6 +1,5 @@ (function() { - var RedisDumper, redis, run, - slice = [].slice; + var RedisDumper, redis, run; run = require('async').waterfall; @@ -27,18 +26,15 @@ params.convert = null; } dumper = new RedisDumper(params); - return dumper.dump(params, function() { - var params; - params = 1 <= arguments.length ? slice.call(arguments, 0) : []; + return dumper.dump(params, function(...params) { dumper.close(); - return callback.apply(null, params); + return callback(...params); }); }; - RedisDumper = (function() { - function RedisDumper(arg) { - var auth, host, port; - port = arg.port, host = arg.host, auth = arg.auth; + RedisDumper = class RedisDumper { + constructor({port, host, auth}) { + // Connect to redis database if (auth != null) { this.db = redis.createClient(port, host, { auth_pass: auth @@ -48,21 +44,21 @@ } } - RedisDumper.prototype.close = function() { - return this.db.end(); - }; + close() { + // Close redis connection + return this.db.quit(); + } - RedisDumper.prototype.escape = function(value) { - if (/^([a-zA-Z0-9_\:\-]+)$/.test("" + value)) { - return "" + value; + escape(value) { + if (/^([a-zA-Z0-9_\:\-]+)$/.test(`${value}`)) { + return `${value}`; } else { - return "'" + ("" + value).split('\\').join('\\\\').split('\'').join('\\\'') + "'"; + return "'" + `${value}`.split('\\').join('\\\\').split('\'').join('\\\'') + "'"; } - }; + } - RedisDumper.prototype.dump = function(arg, callback) { - var convert, db, e, error, filter, format, keys, pretty, ttls, types, values; - db = arg.db, filter = arg.filter, format = arg.format, convert = arg.convert, pretty = arg.pretty; + dump({db, filter, format, convert, pretty}, callback) { + var e, keys, ttls, types, values; keys = []; types = []; values = []; @@ -77,336 +73,425 @@ } this.db.select(db); return run([ - (function(_this) { - return function(next) { - var error1, k; - try { - if (convert != null) { - return next(null, (function() { - var results; - results = []; - for (k in convert) { - results.push(k); - } - return results; - })()); + // Get keys matching filter + (next) => { + var k; + try { + if (convert != null) { + return next(null, + (function() { + var results; + results = []; + for (k in convert) { + results.push(k); + } + return results; + })()); + } else { + return this.db.keys(filter, + next); + } + } catch (error) { + e = error; + return next(e); + } + }, + // For each key, get its type + (reply, + next) => { + var k, + key, + l, + len1, + len2, + m, + multi, + v; + try { + for (l = 0, len1 = reply.length; l < len1; l++) { + key = reply[l]; + keys.push(key); + } + // If there are no keys, return now + if (keys.length === 0) { + if (format === 'json') { + callback(null, + '{}'); + } else if (format === 'raw') { + callback(null, + {}); } else { - return _this.db.keys(filter, next); + callback(null, + ''); } - } catch (error1) { - e = error1; - return next(e); + next(null, + null); + return; } - }; - })(this), (function(_this) { - return function(reply, next) { - var error1, k, key, l, len1, len2, m, multi, v; - try { - for (l = 0, len1 = reply.length; l < len1; l++) { - key = reply[l]; - keys.push(key); + // Sort keys in alphabetic order (better for versioning) + keys = keys.sort(); + if (convert != null) { + return next(null, + (function() { + var results; + results = []; + for (k in convert) { + v = convert[k]; + results.push(v.type); + } + return results; + })()); + } else { + multi = this.db.multi(); + for (m = 0, len2 = keys.length; m < len2; m++) { + key = keys[m]; + multi.type(key); } - if (keys.length === 0) { - if (format === 'json') { - callback(null, '{}'); - } else if (format === 'raw') { - callback(null, {}); - } else { - callback(null, ''); + return multi.exec(next); + } + } catch (error) { + e = error; + return next(e); + } + }, + // Get data of each key according to its type + (replies, + next) => { + var entry, + i, + l, + len1, + len2, + len3, + len4, + m, + multi, + n, + o, + ref, + result, + type, + val; + try { + if (keys.length === 0) { + next(null, + null); + return; + } + for (l = 0, len1 = replies.length; l < len1; l++) { + type = replies[l]; + types.push(type); + } + if (convert != null) { + result = []; + for (i = m = 0, len2 = types.length; m < len2; i = ++m) { + type = types[i]; + switch (type) { + case 'string': + result.push(convert[keys[i]].value); + break; + case 'list': + result.push(convert[keys[i]].value); + break; + case 'set': + result.push(convert[keys[i]].value); + break; + case 'zset': + val = []; + ref = convert[keys[i]].value; + for (n = 0, len3 = ref.length; n < len3; n++) { + entry = ref[n]; + val.push(entry[1]); + val.push(entry[0]); + } + result.push(val); + break; + case 'hash': + result.push(convert[keys[i]].value); } - next(null, null); - return; } - keys = keys.sort(); - if (convert != null) { - return next(null, (function() { - var results; - results = []; - for (k in convert) { - v = convert[k]; - results.push(v.type); - } - return results; - })()); - } else { - multi = _this.db.multi(); - for (m = 0, len2 = keys.length; m < len2; m++) { - key = keys[m]; - multi.type(key); + return next(null, + result); + } else { + multi = this.db.multi(); + for (i = o = 0, len4 = types.length; o < len4; i = ++o) { + type = types[i]; + switch (type) { + case 'string': + multi.get(keys[i]); + break; + case 'list': + multi.lrange(keys[i], + 0, + -1); + break; + case 'set': + multi.smembers(keys[i]); + break; + case 'zset': + multi.zrange(keys[i], + 0, + -1, + 'withscores'); + break; + case 'hash': + multi.hgetall(keys[i]); } - return multi.exec(next); } - } catch (error1) { - e = error1; - return next(e); + return multi.exec(next); + } + } catch (error) { + e = error; + return next(e); + } + }, + // Get TTL of each key + (replies, + next) => { + var key, + l, + len1, + len2, + len3, + m, + multi, + n, + result, + value; + try { + if (keys.length === 0) { + next(null, + null); + return; } - }; - })(this), (function(_this) { - return function(replies, next) { - var entry, error1, i, l, len1, len2, len3, len4, m, multi, n, o, ref, result, type, val; - try { - if (keys.length === 0) { - next(null, null); - return; + for (l = 0, len1 = replies.length; l < len1; l++) { + value = replies[l]; + values.push(value); + } + if (convert != null) { + result = []; + for (m = 0, len2 = keys.length; m < len2; m++) { + key = keys[m]; + if (convert[key].ttl != null) { + result.push(`${convert[key].ttl}`); + } else { + result.push("-1"); + } } - for (l = 0, len1 = replies.length; l < len1; l++) { - type = replies[l]; - types.push(type); + return next(null, + result); + } else { + multi = this.db.multi(); + for (n = 0, len3 = keys.length; n < len3; n++) { + key = keys[n]; + multi.ttl(key); } - if (convert != null) { - result = []; + return multi.exec(next); + } + } catch (error) { + e = error; + return next(e); + } + }, + // Render result as the requested format + (replies, + next) => { + var commands, + i, + item, + j, + json, + k, + key, + l, + len, + len1, + len2, + len3, + m, + n, + ttl, + type, + v, + value; + try { + if (keys.length === 0) { + next(null, + null); + return; + } + for (l = 0, len1 = replies.length; l < len1; l++) { + ttl = replies[l]; + ttls.push(ttl); + } + switch (format) { + case 'json' || 'raw': + // Create json from key's type and data (default) + json = {}; for (i = m = 0, len2 = types.length; m < len2; i = ++m) { type = types[i]; + key = keys[i]; + value = values[i]; switch (type) { case 'string': - result.push(convert[keys[i]].value); + json[key] = { + type: 'string', + value: value + }; break; case 'list': - result.push(convert[keys[i]].value); + json[key] = { + type: 'list', + value: value + }; break; case 'set': - result.push(convert[keys[i]].value); + json[key] = { + type: 'set', + value: value.sort() // Sort set for better versioning + }; break; case 'zset': - val = []; - ref = convert[keys[i]].value; - for (n = 0, len3 = ref.length; n < len3; n++) { - entry = ref[n]; - val.push(entry[1]); - val.push(entry[0]); - } - result.push(val); + json[key] = { + type: 'zset', + value: (function() { + var len3, + n, + results; + results = []; + for (j = n = 0, len3 = value.length; n < len3; j = n += 2) { + item = value[j]; + results.push([parseInt(value[j + 1], + 10), + value[j]]); + } + return results; + })() + }; break; case 'hash': - result.push(convert[keys[i]].value); + json[key] = { + type: 'hash', + value: value + }; + } + ttl = parseInt(ttls[i], + 10); + if (!isNaN(ttl) && ttl !== -1) { + json[key].ttl = ttl; } } - return next(null, result); - } else { - multi = _this.db.multi(); - for (i = o = 0, len4 = types.length; o < len4; i = ++o) { + // Return result + if (format === 'json') { + if (pretty) { + return callback(null, + JSON.stringify(json, + null, + 4)); + } else { + return callback(null, + JSON.stringify(json)); + } + } else { + return callback(null, + json); + } + break; + default: + // Create redis-cli compliant commands from key's type and data (default) + commands = []; + for (i = n = 0, len3 = types.length; n < len3; i = ++n) { type = types[i]; + key = keys[i]; + value = values[i]; switch (type) { case 'string': - multi.get(keys[i]); + commands.push(`SET ${this.escape(key)} ${this.escape(value)}`); break; case 'list': - multi.lrange(keys[i], 0, -1); + commands.push(`DEL ${this.escape(key)}`); + commands.push(`RPUSH ${this.escape(key)} ${((function() { + var len4, + o, + results; + results = []; + for (o = 0, len4 = value.length; o < len4; o++) { + item = value[o]; + results.push(this.escape(item)); + } + return results; + }).call(this)).join(' ')}`); break; case 'set': - multi.smembers(keys[i]); + commands.push(`DEL ${this.escape(key)}`); + if (value.length !== 0) { + commands.push(`SADD ${this.escape(key)} ${((function() { + var len4, + o, + results; + results = []; + for (o = 0, len4 = value.length; o < len4; o++) { + item = value[o]; + results.push(this.escape(item)); + } + return results; + }).call(this)).join(' ')}`); + } break; case 'zset': - multi.zrange(keys[i], 0, -1, 'withscores'); + commands.push(`DEL ${this.escape(key)}`); + if (value.length !== 0) { + commands.push(`ZADD ${this.escape(key)} ${((function() { + var len4, + o, + results; + results = []; + for (j = o = 0, len4 = value.length; o < len4; j = o += 2) { + item = value[j]; + results.push(this.escape(value[j + 1]) + ' ' + this.escape(value[j])); + } + return results; + }).call(this)).join(' ')}`); + } break; case 'hash': - multi.hgetall(keys[i]); - } - } - return multi.exec(next); - } - } catch (error1) { - e = error1; - return next(e); - } - }; - })(this), (function(_this) { - return function(replies, next) { - var error1, key, l, len1, len2, len3, m, multi, n, result, value; - try { - if (keys.length === 0) { - next(null, null); - return; - } - for (l = 0, len1 = replies.length; l < len1; l++) { - value = replies[l]; - values.push(value); - } - if (convert != null) { - result = []; - for (m = 0, len2 = keys.length; m < len2; m++) { - key = keys[m]; - if (convert[key].ttl != null) { - result.push("" + convert[key].ttl); - } else { - result.push("-1"); - } - } - return next(null, result); - } else { - multi = _this.db.multi(); - for (n = 0, len3 = keys.length; n < len3; n++) { - key = keys[n]; - multi.ttl(key); - } - return multi.exec(next); - } - } catch (error1) { - e = error1; - return next(e); - } - }; - })(this), (function(_this) { - return function(replies, next) { - var commands, error1, i, item, j, json, k, key, l, len, len1, len2, len3, m, n, ttl, type, v, value; - try { - if (keys.length === 0) { - next(null, null); - return; - } - for (l = 0, len1 = replies.length; l < len1; l++) { - ttl = replies[l]; - ttls.push(ttl); - } - switch (format) { - case 'json' || 'raw': - json = {}; - for (i = m = 0, len2 = types.length; m < len2; i = ++m) { - type = types[i]; - key = keys[i]; - value = values[i]; - switch (type) { - case 'string': - json[key] = { - type: 'string', - value: value - }; - break; - case 'list': - json[key] = { - type: 'list', - value: value - }; - break; - case 'set': - json[key] = { - type: 'set', - value: value.sort() - }; - break; - case 'zset': - json[key] = { - type: 'zset', - value: (function() { - var len3, n, results; - results = []; - for (j = n = 0, len3 = value.length; n < len3; j = n += 2) { - item = value[j]; - results.push([parseInt(value[j + 1], 10), value[j]]); - } - return results; - })() - }; - break; - case 'hash': - json[key] = { - type: 'hash', - value: value - }; - } - ttl = parseInt(ttls[i], 10); - if (!isNaN(ttl) && ttl !== -1) { - json[key].ttl = ttl; - } - } - if (format === 'json') { - if (pretty) { - return callback(null, JSON.stringify(json, null, 4)); - } else { - return callback(null, JSON.stringify(json)); - } - } else { - return callback(null, json); - } - break; - default: - commands = []; - for (i = n = 0, len3 = types.length; n < len3; i = ++n) { - type = types[i]; - key = keys[i]; - value = values[i]; - switch (type) { - case 'string': - commands.push("SET " + (_this.escape(key)) + " " + (_this.escape(value))); - break; - case 'list': - commands.push("DEL " + (_this.escape(key))); - commands.push("RPUSH " + (_this.escape(key)) + " " + (((function() { - var len4, o, results; + commands.push(`DEL ${this.escape(key)}`); + len = 0; + for (k in value) { + len++; + } + if (len !== 0) { + commands.push(`HMSET ${this.escape(key)} ${((function() { + var results; results = []; - for (o = 0, len4 = value.length; o < len4; o++) { - item = value[o]; - results.push(this.escape(item)); + for (k in value) { + v = value[k]; + results.push(this.escape(k) + ' ' + this.escape(v)); } return results; - }).call(_this)).join(' '))); - break; - case 'set': - commands.push("DEL " + (_this.escape(key))); - if (value.length !== 0) { - commands.push("SADD " + (_this.escape(key)) + " " + (((function() { - var len4, o, results; - results = []; - for (o = 0, len4 = value.length; o < len4; o++) { - item = value[o]; - results.push(this.escape(item)); - } - return results; - }).call(_this)).join(' '))); - } - break; - case 'zset': - commands.push("DEL " + (_this.escape(key))); - if (value.length !== 0) { - commands.push("ZADD " + (_this.escape(key)) + " " + (((function() { - var len4, o, results; - results = []; - for (j = o = 0, len4 = value.length; o < len4; j = o += 2) { - item = value[j]; - results.push(this.escape(value[j + 1]) + ' ' + this.escape(value[j])); - } - return results; - }).call(_this)).join(' '))); - } - break; - case 'hash': - commands.push("DEL " + (_this.escape(key))); - len = 0; - for (k in value) { - len++; - } - if (len !== 0) { - commands.push("HMSET " + (_this.escape(key)) + " " + (((function() { - var results; - results = []; - for (k in value) { - v = value[k]; - results.push(this.escape(k) + ' ' + this.escape(v)); - } - return results; - }).call(_this)).join(' '))); - } - } - ttl = parseInt(ttls[i], 10); - if (!isNaN(ttl) && ttl !== -1) { - commands.push("EXPIRE " + (_this.escape(key)) + " " + ttl); - } + }).call(this)).join(' ')}`); + } } - return callback(null, commands.join("\n")); - } - } catch (error1) { - e = error1; - return next(e); + ttl = parseInt(ttls[i], + 10); + if (!isNaN(ttl) && ttl !== -1) { + commands.push(`EXPIRE ${this.escape(key)} ${ttl}`); + } + } + // Return result + return callback(null, + commands.join("\n")); } - }; - })(this) + } catch (error) { + e = error; + return next(e); + } + } ], function(err) { return callback(err); }); - }; - - return RedisDumper; + } - })(); + }; }).call(this); diff --git a/bin/test.js b/bin/test.js index b847e96..266cd4f 100644 --- a/bin/test.js +++ b/bin/test.js @@ -7,7 +7,7 @@ filter: '*' }, function(err, result) { if (err != null) { - return process.stderr.write(err + "\n"); + return process.stderr.write(`${err}\n`); } return console.log(result); }); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..cf67d25 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,151 @@ +{ + "name": "redis-dump", + "version": "0.1.10", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "async": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.1.0.tgz", + "integrity": "sha512-4vx/aaY6j/j3Lw3fbCHNWP0pPaTCew3F6F3hYyl/tHs/ndmV1q7NW9T5yuJ2XAGwdQrP+6Wu20x06U4APo/iQQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "coffeescript": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.4.1.tgz", + "integrity": "sha512-34GV1aHrsMpTaO3KfMJL40ZNuvKDR/g98THHnE9bQj8HjMaZvSrLik99WWqyMhRtbe8V5hpx5iLgdcSvM/S2wg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "double-ended-queue": { + "version": "2.1.0-0", + "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", + "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "redis": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", + "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==", + "requires": { + "double-ended-queue": "^2.1.0-0", + "redis-commands": "^1.2.0", + "redis-parser": "^2.6.0" + } + }, + "redis-commands": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.5.0.tgz", + "integrity": "sha512-6KxamqpZ468MeQC3bkWmCB1fp56XL64D4Kf0zJSwDZbVLLm7KFkoIcHrgRvQ+sk8dnhySs7+yBg94yIkAK7aJg==" + }, + "redis-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", + "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=" + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff --git a/package.json b/package.json index ad2dd3d..ea515c5 100644 --- a/package.json +++ b/package.json @@ -18,13 +18,13 @@ "redis-dump": "./bin/cli/redis-dump" }, "dependencies": { - "async": "^1.5.2", - "optimist": "^0.3.7", - "redis": "^2.6.2" + "async": "^3.1.0", + "optimist": "^0.6.1", + "redis": "^2.8.0" }, "devDependencies": { - "coffee-script": "^1.2.0", - "glob": "^7.0.3" + "coffeescript": "^2.4.1", + "glob": "^7.1.4" }, "repository": { "type": "git", diff --git a/src/dump.coffee b/src/dump.coffee index b1cb66a..76964ef 100644 --- a/src/dump.coffee +++ b/src/dump.coffee @@ -25,7 +25,7 @@ class RedisDumper close: -> # Close redis connection - @db.end() + @db.quit() escape: (value) -> if /^([a-zA-Z0-9_\:\-]+)$/.test "#{value}"