Pull to refresh
0
InterSystems
InterSystems IRIS: СУБД, ESB, BI, Healthcare

Релиз GlobalsDB 2012.2

Reading time 6 min
Views 2.8K
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.
Tags:
Hubs:
+2
Comments 3
Comments Comments 3

Articles

Information

Website
www.intersystems.com
Registered
Founded
1978
Employees
1,001–5,000 employees
Location
США