Comparing version 0.1.2 to 0.1.3
@@ -16,2 +16,20 @@ var _ = require('underscore'); | ||
var copyNode = function (fromNode, parentNode, key) { | ||
var newNode = {}; | ||
if (fromNode.type) { | ||
newNode.type = fromNode.type; | ||
} | ||
newNode.mediaType = fromNode.mediaType; | ||
parentNode.nodes[key] = newNode; | ||
if (fromNode.type === 'collection') { | ||
newNode.nodes = {}; | ||
Object.keys(fromNode.nodes).forEach(function (fromKey) { | ||
copyNode(fromNode.nodes[fromKey], newNode, fromKey); | ||
}); | ||
} else { | ||
// will not mutate buffer, so no need to copy | ||
newNode.value = fromNode.value; | ||
} | ||
}; | ||
var nodeValue = { | ||
@@ -41,3 +59,31 @@ collection: function (node, prefix) { | ||
var meta = function (msg) { | ||
var getLocation = function (key) { | ||
var parentNode = null; | ||
var node = null; | ||
var nodeKey; | ||
if (key === '') { | ||
node = root; | ||
} else { | ||
var keys = key.split('/'); | ||
if (keys.length === 1) { | ||
parentNode = root; | ||
node = getNode(parentNode, key); | ||
nodeKey = key; | ||
} else { | ||
var parentKey = keys.slice(0, keys.length - 1).join('/'); | ||
parentNode = getNode(root, parentKey); | ||
nodeKey = keys[keys.length - 1]; | ||
if (parentNode) { | ||
node = getNode(parentNode, nodeKey); | ||
} | ||
} | ||
} | ||
return { | ||
parent: parentNode, | ||
node: node, | ||
key: nodeKey | ||
}; | ||
}; | ||
var getMeta = function (msg) { | ||
var node = getNode(root, msg.key); | ||
@@ -61,3 +107,3 @@ if (!node) { | ||
get: function (msg) { | ||
var result = meta(msg); | ||
var result = getMeta(msg); | ||
var node = result.node; | ||
@@ -72,22 +118,6 @@ var prefix = msg.key === '' ? '' : msg.key + '/'; | ||
set: function (msg) { | ||
var parentNode = null; | ||
var node = null; | ||
var nodeKey; | ||
if (msg.key === '') { | ||
node = root; | ||
} else { | ||
var keys = msg.key.split('/'); | ||
if (keys.length === 1) { | ||
parentNode = root; | ||
node = getNode(parentNode, msg.key); | ||
nodeKey = msg.key; | ||
} else { | ||
var parentKey = keys.slice(0, keys.length - 1).join('/'); | ||
parentNode = getNode(root, parentKey); | ||
nodeKey = keys[keys.length - 1]; | ||
if (parentNode) { | ||
node = getNode(parentNode, nodeKey); | ||
} | ||
} | ||
} | ||
var loc = getLocation(msg.key); | ||
var parentNode = loc.parent; | ||
var node = loc.node; | ||
var nodeKey = loc.key; | ||
if (!parentNode && node) { | ||
@@ -99,2 +129,6 @@ if (msg.type === 'collection') { | ||
} else if (parentNode && parentNode.nodes) { | ||
if (msg.op === 'delete') { | ||
delete parentNode.nodes[nodeKey]; | ||
return; | ||
} | ||
var newNode = {}; | ||
@@ -105,3 +139,3 @@ if (msg.type) { | ||
if (msg.type !== 'collection') { | ||
newNode.value = msg.value; | ||
newNode.value = new Buffer(msg.value); | ||
newNode.mediaType = msg.mediaType || 'application/octet-stream'; | ||
@@ -117,4 +151,24 @@ } else { | ||
meta: function (msg) { | ||
var result = meta(msg); | ||
var result = getMeta(msg); | ||
return result.msg; | ||
}, | ||
delete: function (msg) { | ||
return ops.set(msg); | ||
}, | ||
copy: function (msg) { | ||
var fromMeta = getMeta(msg); | ||
var fromNode = fromMeta.node; | ||
var loc = getLocation(msg.toKey); | ||
if (loc.parent) { | ||
if (loc.node) { | ||
ops.set({op: 'delete', key: msg.toKey}); | ||
} | ||
copyNode(fromNode, loc.parent, loc.key); | ||
return; | ||
} | ||
throw new error.NotFound({key: msg.key}); | ||
}, | ||
move: function (msg) { | ||
ops.copy(msg); | ||
ops.set({op: 'delete', key: msg.key}); | ||
} | ||
@@ -121,0 +175,0 @@ }; |
{ | ||
"name": "keydb", | ||
"version": "0.1.2", | ||
"version": "0.1.3", | ||
"description": "Key/value data/query API to use on the server and in the browser.", | ||
@@ -5,0 +5,0 @@ "main": "index-server.js", |
@@ -42,2 +42,38 @@ var chai = require('chai'); | ||
}); | ||
it('should copy a value on a collection', function () { | ||
return db({op: 'copy', key: 'users/joe', toKey: 'users/joseph'}); | ||
}); | ||
it('should get copied value', function () { | ||
return db({op: 'get', key: 'users/joseph'}) | ||
.then(function (msg) { | ||
expect(msg.value).to.eql({fn: 'Joe'}); | ||
}); | ||
}); | ||
it('should move a value on a collection', function () { | ||
return db({op: 'move', key: 'users/joseph', toKey: 'users/jack'}); | ||
}); | ||
it('should get moved value', function () { | ||
return db({op: 'get', key: 'users/jack'}) | ||
.then(function (msg) { | ||
expect(msg.value).to.eql({fn: 'Joe'}); | ||
}); | ||
}); | ||
it('should not find moved value at original location', function () { | ||
return expect(db({op: 'get', key: 'users/joseph'})).to.be.rejectedWith(keydb.error.NotFound); | ||
}); | ||
it('should copy a collection', function () { | ||
return db({op: 'copy', key: 'users', toKey: 'losers'}); | ||
}); | ||
it('should find value at new collection', function () { | ||
return db({op: 'get', key: 'losers/jack'}) | ||
.then(function (msg) { | ||
expect(msg.value).to.eql({fn: 'Joe'}); | ||
}); | ||
}); | ||
it('should delete a value from a collection', function () { | ||
return db({op: 'delete', key: 'users/joe'}); | ||
}); | ||
it('should not find a deleted value on a collection', function () { | ||
return expect(db({op: 'get', key: 'users/joe'})).to.be.rejectedWith(keydb.error.NotFound); | ||
}); | ||
it('should set a media value on a collection', function () { | ||
@@ -44,0 +80,0 @@ return db({op: 'set', key: 'files', type: 'collection', value: {}}).then(function () { |
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
63874
1932