Релиз GlobalsDB 2012.2

15 мая 2012 г. вышла новая версия бесплатной 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.13×64.
Семейство версий 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.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *