Релиз GlobalsDB 2012.2

    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
    76,00
    Вендор: СУБД Caché, OLAP DeepSee, шина Ensemble
    Поделиться публикацией

    Похожие публикации

    Комментарии 3

      0
      На сайте globalsdb.org какие-то глюки (счётчик загрузок полетел) и загрузить GlobalsDB с помощью Хрома я не смог.
        0
        Я вот сейчас попробовал (тоже Хромом). Версия для Windows качается с сайта globalsdb.org/downloads
          0
          Поправили, видимо.

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое