var Connection = require ('./connection');

module.exports = new Class
({
	Extends: Vn.Object
	,Tag: 'db-query'
	,Properties:
	{
		/**
		 * The connection used to execute the statement.
		 **/
		conn:
		{
			type: Connection
			,set: function (x)
			{
				this._conn = x;
				this.onChange ();
			}
			,get: function ()
			{
				return this._conn;
			}
		},
		/**
		 * The model query.
		 **/
		query:
		{
			type: String
			,set: function (x)
			{
				this._stmt = new Sql.String ({query: x});
				this.onChange ();
			}
			,get: function ()
			{
				return this._stmt.render (null);
			}
		},
		/**
		 * The model select statement.
		 **/
		stmt:
		{
			type: Sql.Stmt
			,set: function (x)
			{
				this._stmt = x;
				this.onChange ();
			}
			,get: function ()
			{
				return this._stmt;
			}
		},
		/**
		 * The batch used to execute the statement.
		 **/
		batch:
		{
			type: Sql.Batch
			,set: function (x)
			{
				this.link ({_batch: x}, {'changed': this.onChange});
				this.onChange ();
			}
			,get: function ()
			{
				return this._batch;
			}
		},
		/**
		 * Wether to execute automatically de query que it's ready.
		 **/
		autoLoad:
		{
			type: Boolean,
			value: false
		}
	}

	,initialize: function (props)
	{
		this.parent (props);
	}

	,loadXml: function (builder, node)
	{
		this.parent (builder, node);

		var query = node.firstChild.nodeValue;
		
		if (query)
			this.query = query;
	}
	
	,execute: function ()
	{
		this._conn.execStmt (this._stmt,
			this.onQueryDone.bind (this), this._batch);
	}
	
	,onQueryDone: function (resultSet)
	{
		this.signalEmit ('ready', resultSet);
	}
	
	,onChange: function ()
	{
		if (this.autoLoad && this._conn && this._stmt && this._batch)
			this.execute ();
	}
});