15 мая вышла новая версия бесплатной NoSQL СУБД GlobalsDB 2012.2.
Что нового?
Добавлен ожидаемый многими Node.JS API интерфейс для Windows, и сразу же для Windows 64-bit.
Реализованы небольшие дополнения и устранены некоторые ошибки.
Об этом и остальном .
Полная версия Release notes GlobalsDB 2012.2 на английском языке находится здесь.
GlobalsDB Node.JS API
Node.js под Windows
В этой версии добавлен ожидаемая поддержка Node.js под Windows. API работает с семейством версий node.js 0.6x Документация Node js API доступна по ссылке.
Расширение для Windows называется cache061.node (cache061_node.dll). Для обеспечения обратной совместимости, модуль можно переименовать в cache.node и включить в javascript следующим образом:
var globals = require (‘cache’);
Поддержка для Windows 64-bit
Реализована также поддержка для 64-битных версий Windows для версии node.js 0.6.13x64.
Семейство версий node.js 0.7.x в настоящее время не поддерживается, т.к. пока не выпущена ни одна стабильная версия этой ветви node.js.
Метод Get() возвращает пустую строку для ‘undefined’ узлов вместо ошибки
В этой версии для неопределенных (undefined) узлов Get() возвращает пустую строку вместо выбрасывания ошибки ‘undefined’.
Тем не менее если использовать JSON (рекомендуется) можно определить, в каком узле действительно нет значения, а где значение — есть (даже если это пустая строка). Это можно определить по ключу defined.
Узел с значением:
{
"ok" 1,
"global": "Customer",
"subscripts": [1, "name"],
"data": "InterSystems",
"defined": 1
}
Узел без значения:
{
"ok" 1,
"global": "Customer",
"subscripts": [1, "first-name"],
"data": "",
"defined": 0
}
Реализация функциональности Globals $Query() в методе Node.JS previouse_node()
В этой версии поведение функции GlobalsDB $Query() реализовано в методе node.js previouse_node().
Этот метод возвращает предыдущий узел в сортирующей последовательности узлов на текущем уровне или на родительском, если на текущем уровне узлы кончились. Метод возвращает название глобала, полную ссылку узлов и значение.
Пусть определены следующие данные в глобале:
company[1]="InterSystems"
company[1, "address", "city"]="Cambridge"
company[1, "address", "state"]="MA"
company[1, "address", "country"]="USA"
company[1, "dateOfIncorporation"]="April 1976"
Синхронный вызов:
сигнатура
var result = myData.previous_node({
global: 'myGlobal' [,
subscripts: [sub(1) ,...,sub(N) ]]
}
);
Пример 1
var result = myData.previous_node({
global: 'company',
subscripts: [2]
}
);
console.log('n');
console.log('previous_node(): ' + JSON.stringify(result, null, 't'));
Результат:
previous_node(): {
ok: 1,
global: "company",
subscripts: ["dateOfIncorporation"],
defined: 1,
data: "April 1976"
}
Пример 2
var result = myData.previous_node({
global: 'company',
subscripts: [1, 'address', 'country']
}
);
console.log('n');
console.log('previous_node(): ' + JSON.stringify(result, null, 't'));
Результат
previous_node(): {
ok: 1,
global: "company",
subscripts: [1, "address", "city"],
defined: 1,
data: "Cambridge"
}
Заметим, что в результатом вызова будет именно узел city, так как в сортирующей последовательности перед country стоит узел city.
Асинхронный вызов
Сигнатура
myData.previous_node({
global: 'myGlobal' [,
subscripts: [sub(1),...,sub(N)]]
},
function(error, result) {
if (!error) {
// --- Success ---
console.log('n');
console.log('previous_node(): '+JSON.stringify(result, null, 't'));
}
else {
// --- Error ---
console.log('n');
console.log('ERROR: previous_node(): '+JSON.stringify(result, null, 't'));
}
}
);
Пример 1
myData.previous_node({
global: 'company',
subscripts: [2]
},
function(error, result) {
if (!error) {
// --- Success ---
console.log('n');
console.log('previous_node(): '+JSON.stringify(result, null, 't')); }
else {
// --- Error ---
console.log('n');
console.log('ERROR: previous_node(): ' + JSON.stringify(result, null, 't'));
}
}
);
Результат
previous_node(): {
ok: 1,
global: "company",
subscripts: ["dateOfIncorporation"],
defined: 1,
data: "April 1976"
}
Пример 2
myData.previous_node({
global: 'company',
subscripts: [1, 'address', 'country']},
function(error, result) {
if (!error) {
// --- Success ---
console.log('n');
console.log('previous_node(): '+JSON.stringify(result, null, 't'));
}
else {
// --- Error ---
console.log('n');
console.log('ERROR: previous_node(): ' + JSON.stringify(result, null, 't'));
}
}
);
Результат:
previous_node(): {
ok: 1,
global: "company",
subscripts: [1, "address", "state"],
defined: 1,
data: "MA"
}
Решена “аномалия” с методом increment()
В методе increment() исправлена аномалия с помощью добавления свойства increment при использовании JSON вызовов.
Если JSON не используется для вызова increment(), последний аргумент метода интерпретируется как значение инкремента, кроме случаев, когда передано только имя глобала — в этом случае инкремент будет равен 1.
В случае использования JSON для передачи параметров в increment() значение инкремента будет браться из свойства increment, или равно 1, если оно не задано.
Синхронные операции
Явное указание параметра increment
var result = myData.increment(globalName [,sub(1),...,sub(N)], increment);
в этом случае increment обязателен.
Пример
var result = myData.increment('company','counter',1);
console.log('n');
console.log('increment(): ' + result);
Неявное указание
var result = myData.increment({
global: 'myGlobal' [,
subscripts: [sub(1) ,...,sub(N) ]][,
increment: incVal]
}
);
increment — здесь может быть как положительным, так и отрицательным числовым значением, на которое требуется увеличить/уменьшить значение узла (по умолчанию = 1).
Пример:
var result = myData.increment({
global: 'company',
subscripts: ['counter'],
increment: 1
}
);
console.log('n');
console.log('increment(): ' + JSON.stringify(result, null, 't'));
Результат:
increment(): {
ok: 1,
global: "company",
subscripts: [
"counter"
],
data: "totVal"
}
totVal = значение узла глобала равное значению до вызова + increment
Асинхронный вызов
Сигнатура
myData.increment({
global: 'myGlobal' [,
subscripts: [sub(1) ,...,sub(N) ]],
increment: incVal
},
function(error, result) {
if (!error) {
// --- Success ---
console.log('n');
console.log('increment(): ' + JSON.stringify(result, null, 't'));
}
else {
// --- Error ---
console.log('n');
console.log('ERROR: increment(): ' + JSON.stringify(result, null, 't'));
}
}
);
Результат
{
ok: [0 | 1],
global: "global-name",
subscripts: [[list-of-subscripts-]],
data: "totVal"
}
Пример:
myData.increment({
global: 'company',
subscripts: ['counter'],
increment: 1
},
function(error, result) {
if (!error) {
// --- Success ---
console.log('n');
console.log('increment(): ' + JSON.stringify(result, null, 't'));
}
else {
// --- Error ---
console.log('n');
console.log('ERROR: increment(): ' + JSON.stringify(result, null, 't'));
}
}
);
Результат
increment(): {
ok: 1,
global: "company",
subscripts: ["counter"],
data: "totVal"
}
Небольшие изменения и исправления
1. Исправлен access violation при обработке ошибок асинхронного вызова global_directory().
2. Globals корректно ведет себя при множественных вызовах метода open().
3. Появился ‘Programmers’ режим соединения. В этом режиме для ошибок выводится более детальная информация (например при попытке записать пустую строку в вершину узла) и соединение остается активным при возникновении ошибки.
Изменения в Globals + .NET
Добавлен пример для Visual Basic
Пример работы с Visual Basic повторяет функциональность примеров для C# и Java.
Пример можно найти в директории установки:
<globals-root>/dev/dotnet/samples/globals/vb
Здесь можно загрузить новую версию Globals для различных платформ и API.
Автор: intersystems