mirror of
https://github.com/node-red/node-red.git
synced 2025-03-01 10:36:34 +00:00
Move multiple-get/set logic into individual context stores
This commit is contained in:
@@ -195,9 +195,24 @@ function createContext(id,seed) {
|
||||
var scope = id;
|
||||
var obj = seed || {};
|
||||
var seedKeys;
|
||||
var insertSeedValues;
|
||||
if (seed) {
|
||||
seedKeys = Object.keys(seed);
|
||||
insertSeedValues = function(keys,values) {
|
||||
if (!Array.isArray(keys)) {
|
||||
if (values[0] === undefined) {
|
||||
values[0] = seed[keys];
|
||||
}
|
||||
} else {
|
||||
for (var i=0;i<keys.length;i++) {
|
||||
if (values[i] === undefined) {
|
||||
values[i] = seed[keys[i]];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
obj.get = function(key, storage, callback) {
|
||||
var context;
|
||||
if (!storage && !callback) {
|
||||
@@ -212,71 +227,33 @@ function createContext(id,seed) {
|
||||
}
|
||||
context = getContextStorage(storage);
|
||||
}
|
||||
if (seed) {
|
||||
// Get the value from the underlying store. If it is undefined,
|
||||
// check the seed for a default value.
|
||||
if (callback) {
|
||||
if (!Array.isArray(key)) {
|
||||
context.get(scope,key,function(err, v) {
|
||||
if (v === undefined) {
|
||||
callback(err, seed[key]);
|
||||
} else {
|
||||
callback(err, v);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// If key is an array, get the value of each key.
|
||||
var storeValues = [];
|
||||
var keys = key.slice();
|
||||
var _key = keys.shift();
|
||||
var cb = function(err, v) {
|
||||
if (err) {
|
||||
callback(err);
|
||||
} else {
|
||||
if (v === undefined) {
|
||||
storeValues.push(seed[_key]);
|
||||
} else {
|
||||
storeValues.push(v);
|
||||
}
|
||||
if (keys.length === 0) {
|
||||
callback.apply(null, [null].concat(storeValues));
|
||||
} else {
|
||||
_key = keys.shift();
|
||||
context.get(scope, _key, cb);
|
||||
}
|
||||
}
|
||||
};
|
||||
context.get(scope, _key, cb);
|
||||
}
|
||||
if (callback) {
|
||||
if (!seed) {
|
||||
context.get(scope,key,callback);
|
||||
} else {
|
||||
// No callback, attempt to do this synchronously
|
||||
var storeValue = context.get(scope,key);
|
||||
if (storeValue === undefined) {
|
||||
return seed[key];
|
||||
} else {
|
||||
return storeValue;
|
||||
}
|
||||
context.get(scope,key,function() {
|
||||
if (arguments[0]) {
|
||||
callback(arguments[0]);
|
||||
return;
|
||||
}
|
||||
var results = Array.prototype.slice.call(arguments,[1]);
|
||||
insertSeedValues(key,results);
|
||||
// Put the err arg back
|
||||
results.unshift(undefined);
|
||||
callback.apply(null,results);
|
||||
});
|
||||
}
|
||||
} else {
|
||||
if (!Array.isArray(key)) {
|
||||
return context.get(scope, key, callback);
|
||||
} else {
|
||||
var storeValues = [];
|
||||
var keys = key.slice();
|
||||
var cb = function(err, v) {
|
||||
if (err) {
|
||||
callback(err);
|
||||
} else {
|
||||
storeValues.push(v);
|
||||
if (keys.length === 0) {
|
||||
callback.apply(null, [null].concat(storeValues));
|
||||
} else {
|
||||
context.get(scope, keys.shift(), cb);
|
||||
}
|
||||
}
|
||||
};
|
||||
context.get(scope, keys.shift(), cb);
|
||||
// No callback, attempt to do this synchronously
|
||||
var results = context.get(scope,key);
|
||||
if (seed) {
|
||||
if (Array.isArray(key)) {
|
||||
insertSeedValues(key,results);
|
||||
} else if (results === undefined){
|
||||
results = seed[key];
|
||||
}
|
||||
}
|
||||
return results;
|
||||
}
|
||||
};
|
||||
obj.set = function(key, value, storage, callback) {
|
||||
@@ -293,36 +270,7 @@ function createContext(id,seed) {
|
||||
}
|
||||
context = getContextStorage(storage);
|
||||
}
|
||||
if (!Array.isArray(key)) {
|
||||
context.set(scope, key, value, callback);
|
||||
} else {
|
||||
// If key is an array, set each key-value pair.
|
||||
// If the value array is longer than the key array, then the extra values are ignored.
|
||||
var index = 0;
|
||||
var values = [].concat(value); // Convert the value to an array
|
||||
var cb = function(err) {
|
||||
if (err) {
|
||||
if (callback) {
|
||||
callback(err);
|
||||
}
|
||||
} else {
|
||||
index++;
|
||||
if (index === key.length) {
|
||||
if (callback) {
|
||||
callback(null);
|
||||
}
|
||||
} else {
|
||||
if(index < values.length) {
|
||||
context.set(scope, key[index], values[index], cb);
|
||||
} else {
|
||||
// If the value array is shorter than the key array, use null for missing values.
|
||||
context.set(scope, key[index], null, cb);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
context.set(scope, key[index], values[index], cb);
|
||||
}
|
||||
context.set(scope, key, value, callback);
|
||||
};
|
||||
obj.keys = function(storage, callback) {
|
||||
var context;
|
||||
|
@@ -169,7 +169,16 @@ LocalFileSystem.prototype.get = function(scope, key, callback) {
|
||||
var storagePath = getStoragePath(this.storageBaseDir ,scope);
|
||||
loadFile(storagePath + ".json").then(function(data){
|
||||
if(data){
|
||||
callback(null, util.getMessageProperty(JSON.parse(data),key));
|
||||
data = JSON.parse(data);
|
||||
if (!Array.isArray(key)) {
|
||||
callback(null, util.getMessageProperty(data,key));
|
||||
} else {
|
||||
var results = [undefined];
|
||||
for (var i=0;i<key.length;i++) {
|
||||
results.push(util.getMessageProperty(data,key[i]))
|
||||
}
|
||||
callback.apply(null,results);
|
||||
}
|
||||
}else{
|
||||
callback(null, undefined);
|
||||
}
|
||||
@@ -178,35 +187,43 @@ LocalFileSystem.prototype.get = function(scope, key, callback) {
|
||||
});
|
||||
};
|
||||
|
||||
LocalFileSystem.prototype._set = function(scope, key, value, callback) {
|
||||
var storagePath = getStoragePath(this.storageBaseDir ,scope);
|
||||
loadFile(storagePath + ".json").then(function(data){
|
||||
var obj = data ? JSON.parse(data) : {}
|
||||
util.setMessageProperty(obj,key,value);
|
||||
return fs.outputFile(storagePath + ".json", JSON.stringify(obj, undefined, 4), "utf8");
|
||||
}).then(function(){
|
||||
if(typeof callback === "function"){
|
||||
callback(null);
|
||||
}
|
||||
}).catch(function(err){
|
||||
if(typeof callback === "function"){
|
||||
callback(err);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
LocalFileSystem.prototype.set = function(scope, key, value, callback) {
|
||||
var storagePath = getStoragePath(this.storageBaseDir ,scope);
|
||||
if (this.cache) {
|
||||
this.cache.set(scope,key,value,callback);
|
||||
// With cache enabled, no need to re-read the file prior to writing.
|
||||
var newContext = this.cache._export()[scope];
|
||||
var storagePath = getStoragePath(this.storageBaseDir ,scope);
|
||||
fs.outputFile(storagePath + ".json", JSON.stringify(newContext, undefined, 4), "utf8").catch(function(err) {
|
||||
});
|
||||
} else if (callback && typeof callback !== 'function') {
|
||||
throw new Error("Callback must be a function");
|
||||
} else {
|
||||
this._set(scope,key,value,callback);
|
||||
loadFile(storagePath + ".json").then(function(data){
|
||||
var obj = data ? JSON.parse(data) : {}
|
||||
if (!Array.isArray(key)) {
|
||||
key = [key];
|
||||
value = [value];
|
||||
} else if (!Array.isArray(value)) {
|
||||
// key is an array, but value is not - wrap it as an array
|
||||
value = [value];
|
||||
}
|
||||
for (var i=0;i<key.length;i++) {
|
||||
var v = null;
|
||||
if (i<value.length) {
|
||||
v = value[i];
|
||||
}
|
||||
util.setMessageProperty(obj,key[i],v);
|
||||
}
|
||||
return fs.outputFile(storagePath + ".json", JSON.stringify(obj, undefined, 4), "utf8");
|
||||
}).then(function(){
|
||||
if(typeof callback === "function"){
|
||||
callback(null);
|
||||
}
|
||||
}).catch(function(err){
|
||||
if(typeof callback === "function"){
|
||||
callback(err);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
@@ -28,47 +28,84 @@ Memory.prototype.close = function(){
|
||||
return Promise.resolve();
|
||||
};
|
||||
|
||||
Memory.prototype._getOne = function(scope, key) {
|
||||
var value;
|
||||
var error;
|
||||
if(this.data[scope]){
|
||||
value = util.getMessageProperty(this.data[scope], key);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
Memory.prototype.get = function(scope, key, callback) {
|
||||
var value;
|
||||
var error;
|
||||
try{
|
||||
if(this.data[scope]){
|
||||
value = util.getMessageProperty(this.data[scope], key);
|
||||
}
|
||||
}catch(err){
|
||||
if(callback){
|
||||
if (!Array.isArray(key)) {
|
||||
try {
|
||||
value = this._getOne(scope,key);
|
||||
} catch(err) {
|
||||
if (!callback) {
|
||||
throw err;
|
||||
}
|
||||
error = err;
|
||||
}else{
|
||||
throw err;
|
||||
}
|
||||
if (callback) {
|
||||
callback(error,value);
|
||||
return;
|
||||
} else {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
if(callback){
|
||||
if(error){
|
||||
callback(error);
|
||||
} else {
|
||||
callback(null, value);
|
||||
|
||||
value = [];
|
||||
for (var i=0; i<key.length; i++) {
|
||||
try {
|
||||
value.push(this._getOne(scope,key[i]));
|
||||
} catch(err) {
|
||||
if (!callback) {
|
||||
throw err;
|
||||
} else {
|
||||
callback(err);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (callback) {
|
||||
callback.apply(null, [undefined].concat(value));
|
||||
} else {
|
||||
return value;
|
||||
}
|
||||
};
|
||||
|
||||
Memory.prototype.set =function(scope, key, value, callback) {
|
||||
Memory.prototype.set = function(scope, key, value, callback) {
|
||||
if(!this.data[scope]){
|
||||
this.data[scope] = {};
|
||||
}
|
||||
var error;
|
||||
try{
|
||||
util.setMessageProperty(this.data[scope],key,value);
|
||||
}catch(err){
|
||||
if(callback){
|
||||
if (!Array.isArray(key)) {
|
||||
key = [key];
|
||||
value = [value];
|
||||
} else if (!Array.isArray(value)) {
|
||||
// key is an array, but value is not - wrap it as an array
|
||||
value = [value];
|
||||
}
|
||||
try {
|
||||
for (var i=0; i<key.length; i++) {
|
||||
var v = null;
|
||||
if (i < value.length) {
|
||||
v = value[i];
|
||||
}
|
||||
util.setMessageProperty(this.data[scope],key[i],v);
|
||||
}
|
||||
} catch(err) {
|
||||
if (callback) {
|
||||
error = err;
|
||||
}else{
|
||||
} else {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
if(callback){
|
||||
callback(error || null);
|
||||
callback(error);
|
||||
}
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user