
var Result = require ('./result');

/**
 * This class stores the database results.
 */
module.exports = new Class
({
	 results: null
	,error: null

	/**
	 * Initilizes the resultset object.
	 */
	,initialize: function (results, error)
	{
		this.results = results;
		this.error = error;
	}
	
	/**
	 * Gets the query error.
	 *
	 * @return {Error} the error or null if no errors hapened
	 */
	,getError: function ()
	{
		return this.error;
	}
	
	,fetch: function ()
	{
		if (this.error)
			throw this.error;
	
		if (this.results !== null
		&& this.results.length > 0)
			return this.results.shift ();

		return null;
	}
	
	/**
	 * Fetchs the next result from the resultset.
	 *
	 * @return {Db.Result} the result or %null if error or there are no more results
	 */
	,fetchResult: function ()
	{
		var result = this.fetch ();
	
		if (result !== null)
		{
			if (result.data instanceof Array)
				return new Result (result);
			else
				return true;
		}

		return null;
	}

	/**
	 * Fetchs the first row from the next resultset as an object.
	 *
	 * @return {Object} the row if success, %null otherwise
	 */
	,fetchObject: function ()
	{
		var result = this.fetchResult ();

		if (result instanceof Result)
			return result.fetchObject ();

		return null;
	}
	
	/**
	 * Fetchs the first row from the next resultset.
	 *
	 * @return {Array} the row if success, %null otherwise
	 */
	,fetchRow: function ()
	{
		var result = this.fetch ();

		if (result !== null
		&& result.data instanceof Array
		&& result.data.length > 0)
			return result.data[0];
			
		return null;
	}

	/**
	 * Fetchs the first row and column value from the next resultset.
	 *
	 * @return {Object} the value if success, %null otherwise
	 */
	,fetchValue: function ()
	{
		var row = this.fetchRow ();

		if (row instanceof Array && row.length > 0)
			return row[0];

		return null;
	}
});

