Cliente JavaScript/Typescrypt para Node.js de acesso a banco de dados Firebird charset ISO8859_1 e e UTF8.
Instalação
npm install limber-firebird-client -s
Utilização
const express = require("express");
const firebird = require("limber-firebird-client");
const app = express();
app.use(firebird.databaseParser());
Parâmetros .env
-
FIREBIRD_DISPLAY_LOGS
- Se o valor fortrue
exibe todos os logs da conexão. -
FIREBIRD_CONN_FORCE_CLEAR
- Setrue
define para limpar as conexões não usadas do pool a cada intervalo definido pela opçãoFIREBIRD_CONN_TIMEOUT_CLEAR
ou sefalse
após o tempo máximo definido pela opçãoFIREBIRD_CONN_TIMEOUT_CLEAR
após a última requisição. -
FIREBIRD_CONN_TIMEOUT_CLEAR
- Define o tempo máximo em milissegundos para limpar as conexões do pool. -
FIREBIRD_ENCODING
- Define o encoding para stringsutf8
oulatin1
. -
FIREBIRD_MAX_CONN
- Define o número máximo de conexões simultaneas via pool. -
FIREBIRD_HOST
- Informa o host de acesso ao serviço do banco de dados. -
FIREBIRD_PORT
- Informa a porta de acesso ao serviço do banco de dados. -
FIREBIRD_BASE
- Informa o caminho do arquivo do banco de dados. -
FIREBIRD_USER
- Usuário de acesso do banco de dados. -
FIREBIRD_PASSWD
- Senha de acesso do banco de dados. -
FIREBIRD_LOWERCASE_KEYS
- Retorna o nome das colunas em minúsculo. -
FIREBIRD_ROLE
- Informa a role do banco de dados. -
FIREBIRD_PAGE_SIZE
- Informa o tamanho da paginação do banco de dados. -
FIREBIRD_IMG_MAX_CONN
- Define para a base de imagens o número máximo de conexões simultaneas via pool. -
FIREBIRD_IMG_HOST
- Informa para a base de imagens o host de acesso ao serviço do banco de dados. -
FIREBIRD_IMG_PORT
- Informa para a base de imagens a porta de acesso ao serviço do banco de dados. -
FIREBIRD_IMG_BASE
- Informa para a base de imagens o caminho do arquivo do banco de dados. -
FIREBIRD_IMG_USER
- Usuário de acesso da base de imagens do banco de dados. -
FIREBIRD_IMG_PASSWD
- Senha de acesso da base de imagens do banco de dados. -
FIREBIRD_IMG_LOWERCASE_KEYS
- Retorna o nome das colunas em minúsculo para a base de imagens. -
FIREBIRD_IMG_ROLE
- Informa a role do banco de dados de imagens. -
FIREBIRD_IMG_PAGE_SIZE
- Informa o tamanho da paginação do banco de dados de imagens.
Exemplo:
FIREBIRD_DISPLAY_LOGS=true
FIREBIRD_CONN_FORCE_CLEAR=false
FIREBIRD_CONN_TIMEOUT_CLEAR=1800000
FIREBIRD_ENCODING=utf8
FIREBIRD_MAX_CONN=5
FIREBIRD_HOST=127.0.0.1
FIREBIRD_PORT=3050
FIREBIRD_BASE=C:\Limber\DATA\CDE_WIN.FDB
FIREBIRD_USER=SYSDBA
FIREBIRD_PASSWD=masterkey
FIREBIRD_LOWERCASE_KEYS=false
FIREBIRD_IMG_MAX_CONN=5
FIREBIRD_IMG_HOST=127.0.0.1
FIREBIRD_IMG_PORT=3050
FIREBIRD_IMG_BASE=C:\Limber\DATA\CDE_WIN_IMAGENS.FDB
FIREBIRD_IMG_USER=SYSDBA
FIREBIRD_IMG_PASSWD=masterkey
FIREBIRD_IMG_LOWERCASE_KEYS=false
Parâmetros padrões da biblioteca
-
DEFAULT_FIREBIRD_USER
- Usuário padrão de acesso ao banco de dados. -
DEFAULT_FIREBIRD_PASSWORD
- Senha padrão de acesso ao banco de dados. -
DEFAULT_FIREBIRD_HOST
- Host padrão de acesso ao banco de dados. -
DEFAULT_FIREBIRD_PORT
- Porta padrão de acesso ao banco de dados. -
DEFAULT_FIREBIRD_LOWERCASE_KEYS
- Definição padrão de retorno de colunas em minúsculo. -
DEFAULT_FIREBIRD_PAGE_SIZE
- Valor padrão do tamanho da paginação. -
DEFAULT_FIREBIRD_ROLE
- Valor padrão da role de conexão. -
DEFAULT_FIREBIRD_MAX_POOL_CONNECTION
- Numero padrão do máximo de conexões permitidas no pool. -
DEFAULT_FIREBIRD_TIMEOUT_DESTROY_POOLS
- Tempo padrão que define o tempo máximo em milissegundos para limpar as conexões do pool. -
DEFAULT_FIREBIRD_CONN_FORCE_CLEAR
- Valor padrão da forma de limpar as conexões do pool. -
DEFAULT_FIREBIRD_DISPLAY_LOGS
- Valor padrão se exibe os logs da biblioteca.
Métodos retornados pelo req.firebird
-
req.firebird.attachDataBase(options)
Realiza a conexão direta com o banco de dados e retorna um objeto do tipo DirectDatabase para realização de consultas ou alterações -
req.firebird.openDataBaseRead()
Retorna um objeto do tipo Database apenas para realização de consultas no banco de dados -
req.firebird.openDataBaseWrite(usuario)
Retorna um objeto do tipo Transaction para realizar alterações no banco de dados -
req.firebird.openDataBaseImageRead()
Retorna um objeto do tipo Database apenas para realização de consultas no banco de dados de imagens -
req.firebird.openDataBaseImageWrite()
Retorna um objeto do tipo Transaction para realizar alterações no banco de dados de imagens
Métodos de conexão direta
-
firebird.attachDataBase(options)
Realiza a conexão direta com o banco de dados e retorna um objeto do tipo DirectDatabase para realização de consultas ou alterações -
firebird.attachPool()
Retorna uma conexão disponível no pool do tipo DirectDatabase para realização de consultas ou alterações -
firebird.attachPoolImage()
Retorna uma conexão disponível no pool de imagens do tipo DirectDatabase para realização de consultas ou alterações
Options attachtDataBase
let options = {};
options.host = '127.0.0.1';
options.port = 3050;
options.database = 'C:\\Limber\\DATA\\CDE_WIN.FDB';
options.user = 'SYSDBA';
options.password = 'masterkey';
options.lowercase_keys = false;
options.role = null;
options.pageSize = 4096;
options.encoding = 'utf8';
Database
-
db.query(query, [params])
- Consulta clássica, retorna um Array of Object -
db.queryOne(query, [params])
- Retorna o primeiro objeto da consulta ou null -
db.execute(query, [params])
- Consulta clássica, retorna um Array of Array -
db.executeOne(query, [params])
- Retorna o primeiro Array da consulta ou null -
db.sequentially(query, [params], function(row, index), function(err), isArray)
- Realiza uma consulta de forma sequencial
DirectDatabase
-
db.query(query, [params])
- Consulta clássica, retorna um Array of Object -
db.queryOne(query, [params])
- Retorna o primeiro objeto da consulta ou null -
db.execute(query, [params])
- Consulta clássica, retorna um Array of Array -
db.executeOne(query, [params])
- Retorna o primeiro Array da consulta ou null -
db.sequentially(query, [params], function(row, index), function(err), isArray)
- Realiza uma consulta de forma sequencial -
db.detach()
- Finaliza a conexao direta com o banco de dados -
db.transaction()
- Inicia uma transação com o banco de dados
Transaction
-
transaction.query(query, [params])
- Consulta clássica, retorna um Array of Object -
transaction.queryOne(query, [params])
- Retorna o primeiro objeto da consulta ou null -
transaction.execute(query, [params])
- Consulta clássica, retorna um Array of Array -
transaction.executeOne(query, [params])
- Retorna o primeiro Array da consulta ou null -
transaction.sequentially(query, [params], function(row, index), function(err))
- Realiza uma consulta de forma sequencial
DirectTransaction
-
transaction.query(query, [params])
- Consulta clássica, retorna um Array of Object -
transaction.queryOne(query, [params])
- Retorna o primeiro objeto da consulta ou null -
transaction.execute(query, [params])
- Consulta clássica, retorna um Array of Array -
transaction.executeOne(query, [params])
- Retorna o primeiro Array da consulta ou null -
transaction.sequentially(query, [params], function(row, index), function(err), isArray)
- Realiza uma consulta de forma sequencial -
transaction.commit()
- Confirma as alterações realizadas na transação -
transaction.rollback()
- Reverte as alterações realizadas na transação
Exemplos:
Conexão direta(ASYNCHRONOUS)
router.post('/estabelecimento', (req, res, next) => {
req.firebird.attachDataBase({
host: '127.0.0.1',
port: 3050,
user: 'SYSDBA',
password: 'masterkey',
database: 'C:\\Limber\\DATA\\CDE_WIN.FDB',
lowercase_keys: false,
encoding: 'latin1'
}, (db) => {
db.transaction((err, transaction) => {
if (err) {
db.detach();
next(err);
} else {
transaction.execute('INSERT INTO CAD_ESTABELECIMENTOS (EMPRESA, CODIGO, NOME) VALUES (?,?,?)', [req.body.empresa, req.body.codigo, req.body.nome],
(err, result) => {
if (err) {
transaction.rollback();
db.detach();
next(err);
} else {
transaction.query('SELECT E.EMPRESA, E.CODIGO, E.NOME FROM CAD_ESTABELECIMENTOS E WHERE E.CODIGO = ?', [req.query.codigo],
(err, result) => {
if (err) {
transaction.rollback();
db.detach();
next(err);
} else {
transaction.commit(err => {
if (err) {
transaction.rollback();
db.detach();
next(err);
} else {
db.detach();
res.status(200).json(result);
}
});
}
});
}
});
}
});
});
});
Conexão direta(SYNCHRONOUS)
router.post('/estabelecimento', async (req, res, next) => {
try {
let db = await req.firebird.attachDataBase({
host: '127.0.0.1',
port: 3050,
user: 'SYSDBA',
password: 'masterkey',
database: 'C:\\Limber\\DATA\\CDE_WIN.FDB',
lowercase_keys: false,
encoding: 'latin1'
});
let transaction = await db.transaction();
try {
await transaction.execute('INSERT INTO CAD_ESTABELECIMENTOS (EMPRESA, CODIGO, NOME) VALUES (?,?,?)', [req.body.empresa, req.body.codigo, req.body.nome]);
let result = await transaction.query('SELECT E.EMPRESA, E.CODIGO, E.NOME FROM CAD_ESTABELECIMENTOS E WHERE E.CODIGO = ?', [req.query.codigo]);
await transaction.commit();
res.status(200).json(result);
} catch (e) {
await transaction.rollback();
next(err);
}
await db.detach();
} catch (err) {
next(err);
}
});
Leitura (ASYNCHRONOUS)
router.get('/estabelecimento', (req, res, next) => {
req.firebird.openDataBaseRead((db) => {
db.query('SELECT E.EMPRESA, E.CODIGO, E.NOME FROM CAD_ESTABELECIMENTOS E WHERE E.CODIGO = ?',
[req.query.codigo], (err, result) => {
if (err) {
next(err);
} else {
res.status(200).json(result);
}
});
});
});
Leitura (SYNCHRONOUS)
router.get('/estabelecimento', async (req, res, next) => {
try {
let db = await req.firebird.openDataBaseRead();
let result = await db.query('SELECT E.EMPRESA, E.CODIGO, E.NOME FROM CAD_ESTABELECIMENTOS E WHERE E.CODIGO = ?', [req.query.codigo]);
res.status(200).json(result);
} catch (err) {
next(err);
}
});
Gravação (ASYNCHRONOUS)
router.post('/prevenda', (req, res, next) => {
req.firebird.openDataBaseWrite((transaction) => {
let EMPRESA = req.body.EMPRESA,
CODIGO = req.body.CODIGO,
ESTABELEC = req.body.ESTABELEC,
TABPRECO = req.body.TABPRECO,
DATA = req.body.DATA ,
HORA = req.body.HORA,
TOTAL = req.body.TOTAL;
transaction.query("INSERT INTO PAF_PREVENDA (EMPRESA, CODIGO, ESTABELEC, TABPRECO, DATA, HORA, TOTAL, ID_TRANSACAO) " +
"VALUES (?, ?, ?, ?, ?, ?, ?, GEN_ID(GEN_TRANSACOES0, 1)) RETURNING ID_TRANSACAO",
[EMPRESA, CODIGO, ESTABELEC, TABPRECO, DATA, HORA, TOTAL, TOTAL], (err, result) => {
if (err) {
next(err);
} else {
res.status(200).json(result);
}
});
});
});
Gravação (SYNCHRONOUS)
router.post('/prevenda', async (req, res, next) => {
try {
let EMPRESA = req.body.EMPRESA,
CODIGO = req.body.CODIGO,
ESTABELEC = req.body.ESTABELEC,
TABPRECO = req.body.TABPRECO,
DATA = req.body.DATA ,
HORA = req.body.HORA,
TOTAL = req.body.TOTAL;
let transaction = await req.firebird.openDataBaseWrite();
let result = await transaction.query("INSERT INTO PAF_PREVENDA (EMPRESA, CODIGO, ESTABELEC, TABPRECO, DATA, HORA, TOTAL, ID_TRANSACAO) " +
"VALUES (?, ?, ?, ?, ?, ?, ?, GEN_ID(GEN_TRANSACOES0, 1)) RETURNING ID_TRANSACAO",
[EMPRESA, CODIGO, ESTABELEC, TABPRECO, DATA, HORA, TOTAL, TOTAL]);
res.status(200).json(result);
} catch (err) {
next(err);
}
});
STREAMING A BIG DATA (ASYNCHRONOUS)
router.get('/big', (req, res, next) => {
req.firebird.openDataBaseRead((db) => {
db.sequentially('SELECT * FROM BIGTABLE', function (row, index) {
stream.write(JSON.stringify(row));
}, (err) => {
if (err){
next(err);
}else {
res.status(200).send(stream);
}
});
});
});
STREAMING A BIG DATA (SYNCHRONOUS)
router.get('/big', async (req, res, next) => {
try {
let db = await req.firebird.openDataBaseRead();
await db.sequentially('SELECT * FROM BIGTABLE', (row, index) => stream.write(JSON.stringify(row)));
res.status(200).json(stream);
} catch (err) {
next(err);
}
});
BLOB (stream)
router.post('/user', (req, res, next) => {
req.firebird.openDataBaseWrite((transaction) => {
transaction.query('INSERT INTO USERS (ID, ALIAS, FILE) VALUES(?, ?, ?)',
[1, 'Peter', fs.createReadStream('/users/image.jpg')], (err, result) => {
if (err) {
next(err);
} else {
res.status(200).json(result);
}
});
});
});
BLOB (buffer)
router.post('/user', (req, res, next) => {
req.firebird.openDataBaseWrite((transaction) => {
transaction.query('INSERT INTO USERS (ID, ALIAS, FILE) VALUES(?, ?, ?)',
[1, 'Peter', fs.readFileSync('/users/image.jpg')], (err, result) => {
if (err) {
next(err);
} else {
res.status(200).json(result);
}
});
});
});
READING BLOBS (ASYNCHRONOUS)
router.get('/logo', (req, res, next) => {
req.firebird.openDataBaseRead((db) => {
db.query('SELECT E.LOGO FROM CAD_ESTABELECIMENTOS E WHERE E.EMPRESA = ? AND E.CODIGO = ?',
[req.query.empresa, req.query.codigo], (err, result) => {
if (err) {
next(err);
} else if (result && result.length > 0 && result[0].LOGO) {
res.set({'Content-Type': 'image/png'});
res.status(200).send(result[0].LOGO);
} else {
res.status(204).send('');
}
});
});
});
Desenvolvedor
- Limber Software e Consultoria LTDA