Pull to refresh

и Firebird SQL Server

Reading time 6 min
Views 13K


     О чем это


Являясь автором модуля подключения к 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 через браузер:


Ссылки:

Tags:
Hubs:
+19
Comments 18
Comments Comments 18

Articles