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 следующим образом:
Поддержка для Windows 64-bit
Реализована также поддержка для 64-битных версий Windows для версии node.js 0.6.13x64.
Семейство версий node.js 0.7.x в настоящее время не поддерживается, т.к. пока не выпущена ни одна стабильная версия этой ветви node.js.
Метод Get() возвращает пустую строку для ‘undefined’ узлов вместо ошибки
В этой версии для неопределенных (undefined) узлов Get() возвращает пустую строку вместо выбрасывания ошибки ‘undefined’.
Тем не менее если использовать JSON (рекомендуется) можно определить, в каком узле действительно нет значения, а где значение — есть (даже если это пустая строка). Это можно определить по ключу defined.
Узел с значением:
Узел без значения:
Реализация функциональности Globals $Query() в методе Node.JS previouse_node()
В этой версии поведение функции GlobalsDB $Query() реализовано в методе node.js previouse_node().
Этот метод возвращает предыдущий узел в сортирующей последовательности узлов на текущем уровне или на родительском, если на текущем уровне узлы кончились. Метод возвращает название глобала, полную ссылку узлов и значение.
Пусть определены следующие данные в глобале:
Синхронный вызов:
сигнатура
Пример 1
Результат:
Пример 2
Результат
Заметим, что в результатом вызова будет именно узел city, так как в сортирующей последовательности перед country стоит узел city.
Асинхронный вызов
Сигнатура
Пример 1
Результат
Пример 2
Результат:
Решена “аномалия” с методом increment()
В методе increment() исправлена аномалия с помощью добавления свойства increment при использовании JSON вызовов.
Если JSON не используется для вызова increment(), последний аргумент метода интерпретируется как значение инкремента, кроме случаев, когда передано только имя глобала — в этом случае инкремент будет равен 1.
В случае использования JSON для передачи параметров в increment() значение инкремента будет браться из свойства increment, или равно 1, если оно не задано.
Синхронные операции
Явное указание параметра increment
в этом случае increment обязателен.
Пример
Неявное указание
increment — здесь может быть как положительным, так и отрицательным числовым значением, на которое требуется увеличить/уменьшить значение узла (по умолчанию = 1).
Пример:
Результат:
totVal = значение узла глобала равное значению до вызова + increment
Асинхронный вызов
Сигнатура
Результат
Пример:
Результат
Небольшие изменения и исправления
1. Исправлен access violation при обработке ошибок асинхронного вызова global_directory().
2. Globals корректно ведет себя при множественных вызовах метода open().
3. Появился ‘Programmers’ режим соединения. В этом режиме для ошибок выводится более детальная информация (например при попытке записать пустую строку в вершину узла) и соединение остается активным при возникновении ошибки.
Изменения в Globals + .NET
Добавлен пример для Visual Basic
Пример работы с Visual Basic повторяет функциональность примеров для C# и Java.
Пример можно найти в директории установки:
Здесь можно загрузить новую версию Globals для различных платформ и API.
Что нового?
Добавлен ожидаемый многими 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.