и Firebird SQL Server



         О чем это


    Являясь автором модуля подключения к Firebird для NodeJS, я долго откладывал публикацию о нем, считая, что модуль еще достаточно сырой. Кроме того, развитие модуля несколько застопорилось, поскольку весь необходимый мне функционал в нем уже присутствует (однако он еще далек от универсальности).
    Время от времени только возникает необходимость исправить выявленную ошибку или подправить что-то для обеспечения совместимости с последней стабильной версией NodeJS. Надо сказать, что модуль не является популярным ввиду направленности NodeJS сообщества на NoSQL решения. А Firebird сообщество, видимо, смотрит на NodeJS с осторожностью, да и не такое уж оно и большое. К тому же довольно часто Firebird используется в связке с Delphi на платформе Windows, так что заинтересовать кого-либо из работающих под Windows специфичным Linux решением тоже тяжело. Однако, недавнее значительное продвижение проекта NodeJS в сторону поддержки Windows дало надежду на привлечение внимания таких людей к проекту. Эта публикация будет посвящена тому, как можно работать с Firebird из NodeJS. Будут даны инструкции по установке для Linux и Windows, примеры типовых сценариев работы. Топик, однако, рассчитан на тех, кто хоть немного знаком с Firebird (необходима рабочая копия сервера БД для экспериментов). Для тех, кто не знаком с Firebird, в конце публикации будут даны ссылки на ресурсы для изучения.

    Заинтересовавшимся — добро пожаловать под кат.


    Установка


    Linux

    NodeJS

    Прежде всего вам понадобится NodeJS. В интернете полно руководств по установке NodeJS в Linux. Тем не менее, для полноты картины придется привести еще одно тут. Я скачал дистрибутив Ubuntu 11.10 Server 32bit. Установка производилась в виртуальной машине. В задачу этой публикации не входит описание борьбы со сложностями различных дистрибутивов. Скорее наоборот, нужно описание наиболее легкого пути получения результата.
    Итак, я установил Ubuntu 11.10 Server с минимальными набором пакетов (только OpenSSH сервер).
    Всего две консольных команды позволят вам получить свою копию NodeJS.
    sudo apt-get update
    sudo apt-get install nodejs


    Однако, несмотря на свежий дистрибутив, вы получите версию NodeJS, актуальную в конце лета 2011 года.
    xdenser@ubuntu:~$ node
    > process.version
    'v0.4.9'
    > .exit
    xdenser@ubuntu:~$


    Далее необходимо установить пакетный менеджер NodeJS.
    sudo apt-get install npm


    Еще нам понадобится пакет разработчика для Firebird 2.5, если у вас уже есть сервер, к которому вы хотите подключаться.
    sudo apt-get install firebird2.5-dev


    Если сервера у вас нет, то можно установить сервер локально. Описание этого процесса выходит за рамки публикации.

    При установке модуль доступа к Firebird компилируется. Для этого нам понадобится компилятор.
    sudo apt-get install g++


    Ну и, собственно, сам модуль доступа в данном случае ставится следующей командой
    sudo npm install firebird@0.0.5 -g

    или
    npm install firebird@0.0.5


    Отличие состоит в том, что в первом случае модуль установится глобально — т.е. для всех пользователей.
    Приведенные команды устанавливают устаревшую версию модуля (актуальная версия на момент написания этой статьи v0.0.8), однако совместимую с версией NodeJS v0.4.9 включенной в дистрибутив.

    Для того, чтобы установить последнюю актуальную версию необходимо ввести команду
    npm install firebird


    Только для этого необходимо будет обновить NodeJS до версии 0.6.x.
    Мы же сейчас идем по самому простому пути.

    Итак, проверим, что у нас все установилось верно:
    
    xdenser@ubuntu:~$ node
    > require('firebird');
    { createConnection: [Function],
      createConnectionPool: [Function],
      Stream: { [Function: Stream] super_: { [Function: Stream] super_: [Function: EventEmitter] } } }
    > .exit
    xdenser@ubuntu:~$
    


    Windows


    Для Windows как минимум необходимо установить клиентские библиотеки Firebird из пакета установки под свою версию Windows.

    C NodeJS в Windows с недавних пор все намного проще. Можно воспользоваться официальным установочным пакетом, вместе с которым вы получите и пакетный менеджер npm.

    Не стоит, однако, пока использовать npm для установки модуля firebird под Windows, поскольку модуль распространяется в виде исходных кодов, а автоматическая сборка под Windows пока еще недоступна.
    Для Windows можно воспользоваться готовой сборкой, в которую уже включен NodeJS. Свои скрипты следует размещать в корневой папке сборки и запускать командой

    node.exe myScript.js


    Что дальше?



    Можно попробовать подключиться к какой-нибудь базе данных. Для этого создадим два файла

    test.js:
    var fb = require('firebird');
    console.log(fb);
    var cfg = require("./config").cfg;
    var conn = fb.createConnection();
    console.log(conn);
      conn.connect(cfg.db, cfg.user, cfg.password, cfg.role, function(){
         console.log("Connected to database");
         conn.query("select * from rdb$relations", function(err,res){
             if(err){ 
                 console.log("error");
                 console.log(err);
                 return;  
             }
             console.log( res );
             var r = res.fetchSync("all",true);
             console.log( r );
             conn.disconnect();
         });
    
    });
    


    и
    config.js:
    exports.cfg = {
      // Database connection settings
      db: "localhost:test.fdb",
      user: "sysdba",
      password: "masterkey",
      role: ""
    };
    


    Естественно, параметры подключения в config.js необходимо заменить на свои.
    И запустить командой
    node.exe test.js


    Выполнение строки
    console.log( r );

    из файла test.js выдаст вам в консоль дамп результата выполнения SQL запроса
    select * from rdb$relations


    Небольшое руководство по модулю


    Модуль, как и все модули NodeJS, загружается подобной командой:
    var fb = require('firebird');


    Модуль по сути экспортирует всего два свойства:

    • createConnection — это метод, который создает новый объект подключения к БД Connection.
    • Stream — это объект потока для работы с полями типа BLOB.

    Не будем пока рассматривать работу с BLOB полями.
    А метод createConnection вызывается без параметров
    var conn = fb.createConnection();

    после такого вызова conn можно рассматривать как экземпляр класса Connection со следующими методами и свойствами:
    • connected — свойство, отражающее состояние подключения экземпляра Connection;
    • inTransaction; — свойство, отражающее состояние текущей транзакции (о работе с транзакциями см. далее);
    • function connect(database, username, password, role, callback); — производит подключение к БД;
    • function querySync(sql); — метод. Выполняет SQL запрос и возвращает экземпляр класса FBResult;
    • function query(sql, callback); — метод. Асинхронно выполняет SQL запрос и возвращает результат в callback функцию. Результат так же является экземпляром FBResult;
    • function commitSync(); — метод. Выполняет commit текущей транзакции;
    • function commit(callback); — метод. Делает асинхронный commit текущей транзакции;
    • function rollbackSync(); — метод. Выполняет rollback текущей транзакции;
    • function rollback(callback); — метод. Делает асинхронный rollback текущей транзакции;
    • function addFBevent(name); — метод. Позволяет подписаться на событие name в Firebird;
    • function deleteFBevent(name); — метод. Позволяет отписаться от события name в Firebird.


    Экземпляры класса FBResult предоставляют всего два метода:
    • function fetchSync(rowCount, asObject); — метод. Возвращает JavaScript массив rowCount (или меньше) записей результата запроса. Параметр asObject может принимать значение true или false. От него зависит форма представления каждой записи. В случае true каждая запись представляется JavaScript объектом, где каждому полю соответствует свойство с таким же именем. В случае false каждая запись — это просто массив значений, т.е. fetchSync в таком случае вернет двумерный массив;
    • function fetch(rowCount, asObject, rowCallback, eofCallback); — метод. Производит асинхронную выборку записей. Первые два параметра соответствуют методу fetchSync. rowCallback — функция обратного вызова, которая исполняется для каждой записи выборки, и получает на вход 1 параметр — объект или массив, в зависимости от asObject. Второй обратный вызов eofCallback выполняется, когда выборка заканчивается, и получает на вход два параметра:
      • err — в случае ошибки это объект Error,
      • eof — признак окончания выборки, он равен true, только если мы достигли конца выборки.
      Можно выбирать не весь результат запроса.


    Более полное руководство есть в файле README, который поставляется с модулем. Его также можно почитать онлайн в хранилище на GitHub.

    Работа с транзакциями

    Модуль в текущем исполнении не предоставляет полных возможностей по управлению транзакциями. Каждый объект Connection автоматически начинает транзакцию перед выполнением запроса, если она не была начата ранее или прервана одним из методов commitSync, commit, rollbackSync, rollback.

    Пожалуй, данного количества материала вполне хватит для начальных экспериментов с модулем. Если будет интерес к данной теме, то я опубликую примеры работы с BLOB полями, событиями и prepared query.

    Кроме того, я подготовил пример проекта, который реализует интерактивный сервис для выполнения SQL запросов к БД Firebird через браузер:


    Ссылки:

    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 18
    • +7
      Спасибо вам! Наконец-то я узнал, как правильно выйти из командной строки node!
      • 0
        Да не, .exit функция синхронная, для правильного надо:
        .exit(function(err, result) {
        if(err) throw err;
        return result;
        }
        • 0
          Спасибо вам! Наконец-то я узнал, как правильно выйти из командной строки node!
          • +4
            Рекомендую читать документацию; в частности, подраздел «REPL Features» в разделе «REPL». Там ожидают удивительные открытия: не только «.exit», но также и «.break», «.clear», «.help», «.save», «.load»…
      • 0
        Пока libuv не до конца интегрирована, поддерживать различия между v0.4.x и v0.6.x можно пытаться. А вот с v0.8 мне кажется будет уже сложнее.
        • 0
          Не понял о каких различиях речь? Для v0.4.x ставим старую версию, для v0.6.x новую. Для v0.8 будут свои версии. Новые возможности вниз по версиям распространяться не будут.
          • 0
            По моим наблюдениям довольно много разработчиков не собираются срочно переходит на 0.6, особенно те, кто уже запустиили проекты в продакшн. Лишать их багфиксов и нового функционала не очень хорошо, имхо. Разве что у вас действительно совсем не расширяется функционал последнее время.
            • 0
              А вот о чем. Да для меня пока эта проблема не актуальна. Я как раз надеюсь на увеличение количества разработчиков в связи с лучшей поддержкой Windows.
              • 0
                Тоже жду пока «из коробки» будет работать тулза для сборки аддонов. Видимо в следующей версии придётся отказаться от обратной совместимости, а вот дальше уже обещают более спокойную жизнь.
                • 0
                  Так а что мешает держать один скрипт для node-waf. А другой для node-gyp или как оно там будет называться? Сама то логика работы сильно меняться не должна. Что касается libuv/libev так по-моему там все очень подобно и можно ввести дополнительный уровень абстракции на шаблонах например. Впрочем, сам я таким заниматься не готов :-).
                  • 0
                    Да, приходится держать разные макросы для разных способов инициализации буферов (уже отказался от этого) и разных сигнатур eio_custom (между v0.4 и v0.6). А в 0.7-0.8 уже хорошо бы uv_async использовать, выходит три разные версии. Вот я пока тоже не готов :)
        • +2
          Не пользуюсь SQL, не слышал ранее про Firebird, но рад, что нода обрастает драйверами.
          Удачи вам с модулем и спасибо что рассказали.

          Раз речь про C++ плагины зашла, в монговском драйвере отказались от С++ парсера BSON для новой ноды 0.6, сославшись на то что разница в скорости нивелировалась. Точнее как опция он все еще есть, но рекомендуют использовать нейтивный (js) парсер. Не понял пока из-за чего, то ли скорость нейтивной догнала C++, то ли конвертации туда-обратно снижают скорость сишной до обычной.
          • 0
            В 0.6 со скоростью всё действительно сильно лучше. Раньше для MySQL нативный драйвер отставал от бинарного в 3-15 раз, теперь только в 1.5-2. Лучше, но есть куда стремиться. Так что я пока не намерен бросать поддержку своего бинарного модуля.
            • 0
              P.S. Может они это решили потому что монгуст много оверхеда всё равно добавляет? :D
              • 0
                Тоже может быть, правда автора в сговоре с монгуставцами не замечал.
                Вот что пишут:
                >From V0.8.0 to V0.9.6.9, the Javascript bson parser was slower than an optional C/C++ bson parser. As of V0.9.6.9+, due to performance improvements in the Javascript parser, the C/C++ perser is deprecated and is not installed by default anymore.

                >Раньше для MySQL нативный драйвер отставал от бинарного в 3-15 раз, теперь только в 1.5-2.
                Ничего себе, это только благодаря V8 или сама нода что-то подточила? Или авторы библиотеки.
          • 0
            Нативную библиотеку последнее время не смотрел, могу упустить что-то. Но Node.js с V8 могли и сами дать такой прирост, за послдние полгода очень многое улучшилось.
            • 0
              Самому мне к Firebird SQL Server обращаться незачем, но зато прежде я не знал, что есть, есть ужé модули Node.js, для которых предоставляются предварительно (самим разработчиком модуля) скомпилированные двоичные файлы для Windows. Думал, что это является делом пускай и близкого, но всё же будущего. Так что эта блогозапись порадовала меня, преисполнила оптимизма.

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