//for insert key and data (main)
#include <sys/types.h>

#include <errno.h>
#include <iostream>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <EnvTest.h>
#include <db_cxx.h>
/* include environtmenCreate class */


using std::ostream;
using std::cout;
using std::cerr;


/*constructors  for create path and database name */
EnvironmentCreate::EnvironmentCreate( std::string& pathCreate,
		std::string& databaseName,
		const char *valuePrograms_ ,
		bool isSecondary )
		:pathDbFileName_( pathCreate+databaseName ),
		programs_( valuePrograms_ ),
		databaseDBObject_(NULL,0),
		keySet_(NULL,0),
		valueSet_(NULL,0),
		cFlags_( DB_CREATE )
		{
				/*exception for handle open database*/
			try
			{
				/*error database,check help handle database support */
				databaseDBObject_.set_error_stream( &std::cerr );
				
				/*sort deuplicates,if this is a secondary database*/
				if( isSecondary )
				{
					databaseDBObject_.set_flags( DB_DUPSORT );
				}
				
			/*open database*/
				databaseDBObject_.open( NULL, pathDbFileName_.c_str( ), NULL, DB_BTREE, cFlags_, 0 );
				
				
				
			}
			catch( DbException &exception )
			{ 
				std::cout<<"-------------------------------------------------"<<"\n";
				std::cout<<"Error open database "<<pathDbFileName_<<"\n";
				std::cerr<<exception.what()<<std::endl;
				std::cout<<"-------------------------------------------------"<<"\n";
			}
			catch( std::exception &exception )
			{
				std::cout<<"-------------------------------------------------"<<"\n";
				std::cout<<"Error open database "<<pathDbFileName_<<"\n";
				std::cerr<<exception.what()<<std::endl;
				std::cout<<"-------------------------------------------------"<<"\n";
			}
	      
	
	    };
		
/* constructor */
		EnvironmentCreate::EnvironmentCreate()
										:databaseDBObject_(NULL,0),
										keySet_(NULL,0),
										valueSet_(NULL,0){};
		
/* close database memberfion define */
		void EnvironmentCreate::close()
		{
			//handle close database;
			try
			{
				std::cout<<"-------------------------------------------------"<<"\n";
				databaseDBObject_.close( 0 );
				std::cout<<"Database close "<< databaseName_ <<"\n";
				std::cout<<" closed() "<<std::endl;
				std::cout<<"-------------------------------------------------"<<"\n";
			}
			catch( DbException &dbHandle )
			{
				std::cout<<"-------------------------------------------------"<<"\n";
				std::cerr<<" Error closing database "<< databaseName_ <<"\n";
				std::cerr<< dbHandle.what() <<std::endl;
				std::cout<<"-------------------------------------------------"<<"\n";
			}
			catch( std::exception &exception )
			{
				std::cout<<"-------------------------------------------------"<<"\n";
			     std::cout<<"Error close databse "<<pathDbFileName_<<"\n";
				 std::cerr<<exception.what()<<std::endl;
				 std::cout<<"-------------------------------------------------"<<"\n";
			}
		}
		
    /* define insertDatabase
     * return ture,if can insert data */
		bool EnvironmentCreate::insertDatabase(  char *keyInsert,
				 char *valueInsert,
				const EnvironmentCreate& environmentDatabasePathName )		
		   {
			/*for handle insert data to database file */
			try
			{
				/*set path name */
				std::string pathSetOpen = environmentDatabasePathName.pathDbFileName_;		
				std::cout<<"Print path name : "<<pathSetOpen<<std::endl; 
				
				/* Error checking */
				databaseDBObject_.set_errpfx( " Error on insertDatabase data member " );
				
				

				
			
//				/* open database */
//				databaseDBObject_.open(NULL,
//					environmentDatabasePathName.pathDbFileName_.c_str( ),
//						NULL,
//						DB_BTREE,
//						cFlags_,
//						0644);			
				
				/*
				 * author Chatsiri.rat
				 *
				 * set key value length 
				 */
				u_int32_t  key_len = ( u_int32_t )strlen( keyInsert );
				
				/*
				 * author Chatsiri.rat
				 *
				 * set data value length
				 */
				 u_int32_t value_len = ( u_int32_t )strlen( valueInsert );
				 /*
				 * author Chatsiri.rat
				 *  Dbt for set key and value
				 */
				 Dbt keySet_( keyInsert, key_len + 1 );
				//setDbt( &keyInsert, key_len ); 
				
				 Dbt valueSet_( valueInsert, value_len + 1 );
				 
				 /*
				 * author Chatsiri.rat
				 *  variable for check error key exist 
				 */
				 int ret = databaseDBObject_.put( 0, & keySet_ , &valueSet_, DB_NOOVERWRITE );
				 
				 if( ret = DB_KEYEXIST )
				 {
					 databaseDBObject_.err( ret, " " );
				 }
				 
				 /*
				 * author Chatsiri.rat
				 * Store value 
				 */
				 Dbt storeValue_;
				 ret = databaseDBObject_.get( 0, &keySet_, &storeValue_, 0 );
				 std::cout<<"StroeValue_ : "<<( char * )storeValue_.get_data()<<std::endl;
				 databaseDBObject_.close(0);			
				
			}
			catch( DbException &dbex )
			{
				databaseDBObject_.err( dbex.get_errno(), "DB exception caught " );
			}
		}
		

		


int main()
{
	std::string pathSet = "/home/Chatsiri.rat/databasedb/";
    std::string nameSet = "database023";
	
	 EnvironmentCreate environ( pathSet, nameSet,"programs",false );
	 /*
	 * author Chatsiri.rat
	 * insert key and data in databases;
	 */
	
	 char * valueKey = "test";
	 char * valueInsert = "chatsiri";
	
	 environ.insertDatabase( valueKey, valueInsert, environ);

	 
	 
	 
	 
	 
	
	
}

