//////////////////////////////////////////////////////////////////////////////
// FILE    : dbt.tol
// PURPOSE : Structures and functions of Data Base Tests
//////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
  Struct @Dbt.EngineType
//////////////////////////////////////////////////////////////////////////////
{ 
  Text os_,      //Operative System
  Text engine_,  //Database Engine
  Text driver_   //Client Driver
};

//////////////////////////////////////////////////////////////////////////////
  Struct @Dbt.EngineInfo
//////////////////////////////////////////////////////////////////////////////
{ 
  Text driver_,    //Client Driver
  Text database_,  //Database name
  Text host_,      //Database Engine Server Host
  Text port_       //Database Engine Server Port
};

//////////////////////////////////////////////////////////////////////////////
  Struct @Dbt.ConnectInfo
//////////////////////////////////////////////////////////////////////////////
{ 
  Text os_,        //Operative System  
  Text engine_,    //Database Engine
  Text driver_,    //Client Driver
  Text database_,  //Database name
  Text host_,      //Database Engine Server Host
  Text port_,      //Database Engine Server Port
  Text alias_,     //Alias of connection (if driver is ODBC must be defined)
  Text user_,      //User with rights over database_
  Text password_,  //User password to access database_
  Real available_  //USed to specify if connection is available and ready
};

//////////////////////////////////////////////////////////////////////////////
  Text Dbt.RootPath(Real unused) 
//////////////////////////////////////////////////////////////////////////////
{
  GetFilePath(GetAbsolutePath(GetSourcePath(Dbt.RootPath)))
};

//////////////////////////////////////////////////////////////////////////////
  Set Dbt.ConnectInfoSeed(@Dbt.EngineType ct)
//////////////////////////////////////////////////////////////////////////////
{
  Text alias = "TolTests_"+ct->engine_+"_"+ct->os_+"_"+ct->driver_;
  Text user  = "toltester";
  Text pwd   = "pwdtt";
  Text dbn   = "toltests";
  Text host  = If(ToLower(ct->os_)==ToLower(OSName),
                  "localhost",
                  ct->os_+"_host");
  Text port  = "";
  Set  eng   = @Dbt.EngineInfo(ct->driver_,dbn,host,port);
  Set @Dbt.ConnectInfo 
  (
    ct->os_,
    ct->engine_,
    ct->driver_,
    dbn,host,port,
    alias,user,pwd,
    1
  )
};

//////////////////////////////////////////////////////////////////////////////
  Set Dbt.Open(@Dbt.ConnectInfo ci)
//////////////////////////////////////////////////////////////////////////////
{
  Set  eng   = @Dbt.EngineInfo(ci->driver_,ci->database_,ci->host_,ci->port_);
  Real open  = If(ci->driver_=="odbc",
                  DBOpen(ci->alias_,ci->user_,ci->password_),
                  DBOpen(ci->alias_,ci->user_,ci->password_,eng));
  Set @Dbt.ConnectInfo 
  (
    ci->os_,
    ci->engine_,
    ci->driver_,
    ci->database_,
    ci->host_,
    ci->port_,
    ci->alias_,
    ci->user_,
    ci->password_,
    open
  )
};

//////////////////////////////////////////////////////////////////////////////
  Set Dbt.Try(@Dbt.ConnectInfo ci)
//////////////////////////////////////////////////////////////////////////////
{
  Set  con = Dbt.Open(ci);
  Real close = If(con->available_,DBClose(con->alias_),?);
  Eval(con->alias_+"=con")
};


//////////////////////////////////////////////////////////////////////////////
  Set Dbt.Engine.Allowed.Get(Real unused)
//////////////////////////////////////////////////////////////////////////////
{
  Text fileName = Dbt.RootPath(0)+"dbt.engine.allowed.bst";
  If(FileExist(fileName), Include(fileName),
  { 
    Set engine.type = Include(Dbt.RootPath(0)+"dbt.engine.type.bst");
    Set seed = EvalSet(engine.type,Dbt.ConnectInfoSeed);
    Set BSTFile(seed,fileName);
    seed
  })
};

//////////////////////////////////////////////////////////////////////////////
  Set Dbt.Engine.Active.Get(Real unused)
//////////////////////////////////////////////////////////////////////////////
{
  Include(Dbt.RootPath(0)+"dbt.engine.active.bst")
};

//////////////////////////////////////////////////////////////////////////////
  Set Dbt.Engine.Active.Update(Real unused)
//////////////////////////////////////////////////////////////////////////////
{
  Set allowed = Select(Dbt.Engine.Allowed.Get(0),Real(@Dbt.ConnectInfo c) 
  { 
    c->available_ 
  });
  Set try = EvalSet(allowed,Dbt.Try);
  Set Dbt.Engine.Active = Select(try,Real(@Dbt.ConnectInfo c) 
  { 
    c->available_ 
  });
  Set BSTFile(Dbt.Engine.Active,Dbt.RootPath(0)+"dbt.engine.active.bst");
  Dbt.Engine.Active
};



