UNPKG

enhancer-data-bridge

Version:

A bridge between Enhancer Clould and user business datasource

213 lines (194 loc) 6.98 kB
'use strict'; var BaseServiceClass = require('./service-base'); var oracledb = require('oracledb'); oracledb.autoCommit = true; var async = require('async'); var dbTypeMap = { '101': 'BINARY_DOUBLE', '100': 'BINARY_FLOAT', '113': 'BLOB', '96': 'CHAR', '112': 'CLOB', '12': 'DATE', '2': 'NUMBER', // or FlOAT '104': 'ROWID', '187': 'TIMESTAMP', '232': 'TIMESTAMP', '188': 'TIMESTAMP', '1': 'VARCHAR2' }; var varTypeMap = { '101': 'number', '100': 'number', '113': 'string', '96': 'string', '112': 'string', '12': 'string', '2': 'number', // or FlOAT '104': 'string', '187': 'string', '232': 'string', '188': 'string', '1': 'string' }; class OracleService extends BaseServiceClass { constructor(dbConfig) { super(dbConfig); dbConfig.connectString = dbConfig.host + '/' + dbConfig.database; this.dbConfig = dbConfig; } // @overridden BaseServiceClass#criteriaQuery criteriaQuery(criteria, callback) { var that = this; var statement = this.prepareSQLStatement(criteria, ':var'); var sql = statement.sql; var params = statement.params; var ROWS_LENGTH = 'ROWS_LENGTH'; var countRecords = function(cb) { if (!criteria.paged || !criteria.countRecords) { return cb(null, ROWS_LENGTH); } // var countSql = "SELECT COUNT(*) RECORDS FROM (" + sql + ") A"; var countSql = that.getCountSql(sql, params, ':var'); oracledb.getConnection(that.dbConfig, function(err, conn) { if (err) { return (err); } conn.execute(countSql.sql, countSql.params, { outFormat: oracledb.OBJECT }, function(err, result) { conn && conn.release(); if (err) { return cb(err); } if (!result.rows.length) { return cb(null, 0); } cb(null, result.rows[0]['RECORDS']); }); }); }; var fetchData = function(cb) { if ( criteria.sortBy ) { sql = sql + " ORDER BY " + criteria.sortBy; } if ( criteria.paged === true ) { criteria.rowNum = parseInt(criteria.rowNum) || 1; var start = ( criteria.page - 1 ) * criteria.rowNum; var end = start + criteria.rowNum + 1; sql = ' SELECT * FROM (SELECT A.*, rownum r__ FROM (' + sql +') A WHERE rownum < ' + end + ') B WHERE r__ > ' + start; } oracledb.getConnection(that.dbConfig, function(err, conn) { if (err) { return (err); } conn.execute(sql, params, { outFormat: criteria.format === 'array' ? oracledb.ARRAY : oracledb.OBJECT, extendedMetaData: criteria.metaData }, function(err, result) { conn && conn.release(); if (err) { err.sql = sql; return cb(err); } result.paged = criteria.paged; result.page = criteria.page; result.rowNum = criteria.rowNum; if (result.metaData) { result.metaData = result.metaData.map(function(f) { f.varType = varTypeMap[f.dbType] || 'string'; f.dbType = dbTypeMap[f.dbType]; return f; }); } if (result.paged === true && result.rows) { result.rows = result.rows.map(function(r) { delete r.r__; return r }); } cb(null, result); }); }); }; async.parallel([countRecords, fetchData], function(err, results) { if (err) { return callback(err); } var records = results[0]; var finalResult = results[1]; finalResult.records = records === ROWS_LENGTH ? finalResult.rows.length : records; callback(null, finalResult); }); } execute(sql, params, callback) { oracledb.getConnection(this.dbConfig, function(err, conn) { if (err) { return (err); } var bindVars = {}; var i = 0; sql = sql.replace(/\?/g, function(s) { var key = 'var' + i; bindVars[key] = params[i]; i++; return ':' + key; }); conn.execute(sql, bindVars, { autoCommit: true, extendedMetaData: true, outFormat: oracledb.OBJECT }, function(err, result) { conn && conn.release(); if (err) { return callback(err); } if (result.rows) { result.metaData = result.metaData.map(function(f) { f.dbType = dbTypeMap[f.type]; f.varType = varTypeMap[f.type] || 'string'; return f; }); } callback(null, result); }); }); } beginTransaction(cb) { oracledb.getConnection(this.dbConfig, function(err, conn) { if (err) { return cb(err); } // hack var exec = conn.execute; conn.execute = function(sql, params, callback) { sql = sql.replace(/\?/g, ':var '); exec.apply(conn, [sql, params, { autoCommit: false, extendedMetaData: true, outFormat: oracledb.OBJECT }, function(err, result) { if (err) { return callback(err); } if (result.rows) { result.metaData = result.metaData.map(function(f) { f.dbType = dbTypeMap[f.type]; f.varType = varTypeMap[f.type] || 'string'; return f; }); } callback(null, result); }]); } cb(null, conn); }); } getConnection(cb) { return oracledb.getConnection(this.dbConfig, cb); } } module.exports = OracleService;