//---------------------------------------------------------------------------
#pragma hdrstop
#include <fstream.h>
#include <cstring.h>
#include "SqlKlasse.h"
//---------------------------Transaktions styrings funktioner-----------------//
///Funktion som benyttes inden der slettes, updateres eller indsættes noget i
///databasen.
void SqlKlasse::StartTransaction()
{
    if(Kilde == 'd')
	  SqlModul->Database->StartTransaction();
}//
///FUnktion til at skrive ændringerne til databasen
void SqlKlasse::Commit()
{
   if(Kilde == 'd')
     SqlModul->Database->Commit();

}//
///FUnktion til at annullere evt. ændringer lavet i databasen.
void SqlKlasse::Rollback()
{
  if(Kilde == 'd')
    SqlModul->Database->Rollback();
}//
//-----------------------------Hoved eksekverings sql funktion----------------//
///Funktionen eksekvere et sql statement som enten setter, updatere eller indsætter
///noget i databasen.
bool SqlKlasse::ExecSql(string S)
{
	switch(Kilde)
    {
      case 'd':
	    try
        {
          SqlModul->Query->Close();
	      SqlModul->Query->SQL->Clear();
          SqlModul->Query->SQL->Add(S.c_str());
          SqlModul->Query->ExecSQL();
        }
        catch(EDBEngineError *e)
        {
          cout << "fejl i indsaetning";
          return false;
        }
        return true;
    }
}//
//-------------------------Indsæt funktioner----------------------------------//
///Funktionen starter et nyt indsæt sql statement i en given tabel.!
void SqlKlasse::IndsaetI(string Table)
{
	S = "insert into " + Table + " values (";
    if(Kilde == 'f')
    {
      Table += ".txt";
      ud = fopen(Table.c_str(), "a");
    }
}//
///Funktionen indsætter en string i sql statementet.
void SqlKlasse::Indsaet(string Value)
{
	S += "'";
    S += Value;
    S += "',";
}//
///FUnktionen indsætter en integer i sql statementet som senere skal eksekveres.
void SqlKlasse::Indsaet(int Value)
{
    char temp[10];

    itoa(Value, temp, 10);
	S += temp;
    S += ',';
}//
///Funktionen indsaetter en double i indsæt statementet.
void SqlKlasse::Indsaet(double Value)
{
    char temp[10];
    sprintf(temp, "%f", Value);
    S += temp;
    S += ',';
}//
///Funktionen indsætter en tupel i databasen. Forinden er statementet blevet
///sammensat ved kald til ovenliggende funktioner.
bool SqlKlasse::Indsaet()
{
    //Der sættes en ")" ind tilsidst i statementet..!
    S[strlen(S.c_str())-1] = ')';

    if(Kilde == 'd')
      return(ExecSql(S));

    else if(Kilde == 'f')
    {
      for(int i = 0; i < strlen(S.c_str()); i++)
        fputc(S[i], ud);
      fputc('\n', ud);
      fclose(ud);
      delete ud;
      return true;
    }
}//
//---------------------------Indlæsnings funktioner---------------------------//
///Funktionen starter indlæsningen, ved at eksekvere det overførte SQL statement.
///Herefter returneres en sandhedsværdi om udfaldet af denne operation.
bool SqlKlasse::StartIndlaesning(const string& S)
{
    switch(Kilde)
    {
      case 'd': //databasen
        try
        {
          SqlModul->Query->Close();
	      SqlModul->Query->SQL->Clear();
          SqlModul->Query->SQL->Add(S.c_str());
          SqlModul->Query->Open();
        }
        catch(EDBEngineError *e)
        {
          cout << "fejl i statement";
          getch();
        }

	    SqlModul->Query->First();
  	    if(SqlModul->Query->Eof)
   	      return false;
        else
	      return true;
        break;
      case 'f': //fil
        ind = new ifstream;
        ind->open(S.c_str());
        if(ind->fail())
          return false;
        return true;
    }
}//
///Funktionen henter en given attribut navngivet ved "string2" som en sting (string)
///Herefter returneres en sandhedsværdi for udfaldet
bool SqlKlasse::FindString(string& string1, string string2)
{
    switch(Kilde)
    {
      case 'd':
      if(!SqlModul->Query->Eof)
	    {
          string1 = SqlModul->Query->FieldByName(string2.c_str())->AsString.c_str();
          return true;
        }
        else
	      return false;
        break;
      case 'f':
        if(!ind->eof())
        {
          *ind >> string1;
          return true;
        }
        ind->close();
        delete ind;
        return false;
    }
}//
///Funktionen henter en given attribut navngivet ved "string2" som en integer.
///Alt efter udfaldet returneres en sandhedsværdi.
bool SqlKlasse::FindInt(int& int1, string string2)
{
    switch(Kilde)
    {
      case 'd':
        if(!SqlModul->Query->Eof)
	    {
          int1 = SqlModul->Query->FieldByName(string2.c_str())->AsInteger;
          return true;
        }
        else
   	      return false;
      case 'f':
        if(!ind->eof())
        {
          *ind >> int1;
          return true;
        }
        ind->close();
        delete ind;
        return false;
    }
}//
///FUnktionen får databasen til at springe videre til næste tupel i de selecterede
///data. Der returneres en sandhedsværdi for om der er flere tilbage at indlæse.!
bool SqlKlasse::FindNaeste()
{
    switch(Kilde)
    {
      case 'd':
       if(!SqlModul->Query->Eof)
	    { SqlModul->Query->Next();
		  return true;
        }
        else
   	      return false;
      case 'f':
        if(!ind->eof())
        {
          char tegn = ' ';
          while(!ind->eof() && tegn != '\n') ind->get(tegn);
          if(!ind->eof())
            return true;
        }
        ind->close();
        delete ind;
        return false;
    }
}//
//--------------------------bi fuktioner--------------------------------------//
///Funktionen skifter til den ønskede kilde. DVs Database eller Filer
void SqlKlasse::SkiftStatus(char Kilde_)
{
    if(Kilde_ == 'f' || Kilde_ == 'd')
      Kilde = Kilde_;
    else
      Kilde = 'f';
}//
///FUnktionen Laver en ansi tring om til en string
string SqlKlasse::StrToAnsiStr(const string& A)
{	return A.c_str();
}//
///Funktionen opretter en helt ny tabel i databasen der hedder test,!
void SqlKlasse::ny(string FilNavn)
{
    string s;
    if(Kilde == 'f')
    {
      ud = fopen(FilNavn.c_str(), "w+");
      fclose(ud);
    }
    else if(Kilde == 'd')
    {
      s  = "drop table test ";
      ExecSql(s);
	  s = "create table test(str1 VARCHAR(10), str2 VARCHAR(10), str3 VARCHAR(10),";
	  s += "str4 VARCHAR(10),str5 VARCHAR(10),tal1 int,tal2 int,tal3 int,tal4 int,";
      s += "dou1 float,dou2 float )";
      ExecSql(s);
    }
}//
///Funktionen benyttes kun i forbindelse med navngivningen af en omkring indsætning
void SqlKlasse::Navn(string Navn, string Table)
{
    Table += ".txt";
    ud = fopen(Table.c_str(), "a");
    for(int i = 0; i < strlen(Navn.c_str()); i++)
      fputc(Navn[i], ud);
    fputc('\n', ud);
    fclose(ud);

}//
//----------------------------------------------------------------------------//
///Konstruktør
SqlKlasse::SqlKlasse(char Kilde_)
{
	Kilde = Kilde_;
}//
//---------------------------------------------------------------------------
