Source: lib/informix.js


'use strict';

var EventEmitter = require( 'events' ).EventEmitter;

var Context = require( './context' );
var Pool    = require( './pool' );


/**
*   Class representing the IBM Informix client
*
*   @constructor
*   @param {object} opts - Constructor options
*/
var Informix = function ( opts ) {

	EventEmitter.call( this );

	// Privileged data
	this.$ = {
		pool : new Pool()
	};

	this.options( opts );

};

Informix.prototype = Object.create( EventEmitter.prototype );


/**
*   Create a new context to execute SQL statements and use transactions safely
*
*   @return {Context} - A context object.
*/
Informix.prototype.createContext = function () {
	return new Context( this.$.pool );
};


/**
*   Set options
*
*   @param {object} opts - Options
*/
Informix.prototype.options = function ( opts ) {
	this.$.opts = opts || {};

	var popts = {
		database : this.$.opts.database,
		username : this.$.opts.username,
		password : this.$.opts.password
	};

	if ( this.$.opts.pool ) {
		for ( var key in this.$.opts.pool ) {
			popts[ key ] = this.$.opts.pool[ key ];
		}
	}

	this.$.pool.options( popts );
};


/**
*   Prepare a statement
*
*   @param {string} sql - SQL statement to prepare
*   @return {Promise.<Statement, Error>} - A promise to a statement object or an
*           Error if rejected.
*/
Informix.prototype.prepare = function ( sql ) {

	var self = this;

	return self.$.pool.acquire()
		.then( function ( conn ) {
			self.$.pool.release( conn );
			return conn.prepare( sql );
		} )
		.catch( function ( err ) {
			self.emit( 'error', err );
			throw err;
		} );

};


/**
*   Run a SQL query
*
*   @param {string} sql - SQL query to run
*   @return {Promise.<Cursor, Error>} - A promise to a results cursor or an Error
*           if rejected.
*/
Informix.prototype.query = function ( sql ) {

	var self = this;

	return self.$.pool.acquire()
		.then( function ( conn ) {
			self.$.pool.release( conn );
			return conn.prepare( sql, { reusable : false } );
		} )
		.then( function ( stmt ) {
			return stmt.exec();
		} )
		.catch( function ( err ) {
			self.emit( 'error', err );
			throw err;
		} );

};



module.exports = Informix;