/***************************************************************************

    supportware
    Copyright (C) 2001-2008 by c.holzheuer
    c.holzheuer@sourceworx.org

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

***************************************************************************/


#ifndef DDDATAQUERY_H
#define DDDATAQUERY_H


#include <dddataconnection.h>
#include <ddmapmulti.h>

class ddwebcgi;
class ddwebview;
class dditem;
//class dddataobject;
class dddataset;


/// dddbqueryitem: ein Feld in einen DB-Query
/**
	dddbqueryitem als eingene Klasse ist nötig, um auch die default-wert semantik zu unterstützen.
	Sonst hätte 'ddstring' auch gereicht.
	?? Hä ?? 
	
*/
 
class dddataqueryitem : public ddbasenamedobject
{

public: 

	dddataqueryitem()
	: _value( DDSTRNULL )
	{
	
	}
	
	
	/**
		Baut einen namenlosen Fülleintrag
	*/
	
	dddataqueryitem( const ddstring& value )
	:	_value( value )
	{
	
	}
 
 
 	/**
		Baut einen Eintrag mit name und wert.
	*/
	
 	dddataqueryitem( const ddstring& name, const ddstring& defvalue )
	:	ddbasenamedobject( name ), _value( DDSTRNULL ), _defvalue( defvalue )
	{
		
	}
	
	
	/**
		Werden für ddmapmulti<dddataqueryitem> benötigt. 
		(Hatte den Verdacht, das C++ sowas automatisch generiert, tuts aber nicht, Gut)
		Die Deep-Copy Constructoren werden aber erzeugt ...
	*/
 
 	inline bool operator==( const dddataqueryitem& src ) const
 	{
 		return ( _name == src._name && _value == src._value && _defvalue == src._defvalue );
 	}
 	
	inline bool operator!=( const dddataqueryitem& src ) const
 	{
 		return ( _name != src._name || _value != src._value || _defvalue != src._defvalue );
 	}
 
 
 	/**
 		Abkürzung für x="17" (string assignment) 
 	*/
 	
 	inline dddataqueryitem& operator=( const ddstring& value )
 	{
 		//cout << "name: " << _name << " value: " << value << endl;
 		_value = value;
 		return *this;
 	}
 	
 	
 	/**
 		Abkürzung für x=17 (number assignment) 
 	*/
 	
 	inline dddataqueryitem& operator=( const int value )
 	{
 		//cout << "name: " << _name << " value: " << value << endl;
 		_value.from_int( value );
 		return *this;
 	}
 		
 		
 	/**
 		Abkürzung für x=17 (number assignment) 
 	*/
 	
 	inline dddataqueryitem& operator=( const size_t value )
 	{
 		//cout << "name: " << _name << " value: " << value << endl;
 		_value.from_size_t( value );
 		return *this;
 	}
 	
 	
 	inline void clear_value()
 	{
 		_value = DDSTRNULL;
 	}
 	
 	inline bool empty() const
 	{
 		return _value.empty();
 	}
 	
 	virtual void dump() const
 	{
 		if( !_name.empty()) 
 			cout << " name: --" << _name << "-- value: " << _value << endl; 
 		else
 			cout << " " << _value << endl; 
 	}
 	
 	
 	/**
 		Wichtige Stelle: wird von dataquery.to_string() aka mapmulti.join() aufgerufen:
 		Wenn der Wert (value) unbelegt ist oder DDSTRNULL ist, wird der Default-Wert zurückgegeben.
 		Neuerdings ist der Default-Wert auch blank und nicht mehr DDSTRNULL, das hatte Probleme
 		gegeben.
 	*/
 	
 	inline ddstring to_string() const
 	{
 		//cout << "--name: " << _name  << " result: " << _value << " : " << _defvalue << endl;
 		if( _value.empty() || _value == DDSTRNULL  )
 			return _defvalue;
 		return _value;
 	}

protected:	
	
	ddstring _value;
	ddstring _defvalue;
	
};


/***************************************************************************

    supportware
    Copyright (C) 2001-2008 by c.holzheuer
    c.holzheuer@sourceworx.org

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

***************************************************************************/


/// Eine Datenbank-Query
/**
	Diesmal KISS: Nur Felder, 
	Stattdessen kapselt die Connection den MySql-Kram.
	FIX! wert-checker noch nachreichen.
*/

class dddataquery : public ddbasename, public ddmapmulti<dddataqueryitem>
{

public:
	
	dddataquery();
  dddataquery( const ddstring& name, const ddstring& querystring );
  virtual ~dddataquery();
	
	void set_query_string( const ddstring& src );
	void set_query_parameter( size_t index, const ddstring& param );	
	void set_query_data( ddwebcgi& cgi );
	void clear_query_data();
	
	inline const ddstring& get_raw_query_string() const
	{
		return _rawquerystring;
	}
	
	virtual void dump() const
  {
  	cout << "----- Dump begin--" << endl;
		_index.dump();
  	for( size_t i=0; i<size(); ++i )
  	{
  		cout << "--- dataquery: " << i ;
  		(*this)[i].dump();
  	}
  	
  	cout << "----- Dump end--" << endl;

  }	
  
protected:

	void add_child( const ddstring& name );
	
	ddstring 				_rawquerystring;
	vector<size_t>	_indexpositions;
 
};

#endif
