2018-02-09 13:52:46 +00:00
|
|
|
|
#include <tsdb.h>
|
2019-03-12 17:38:18 +01:00
|
|
|
|
#include <set>
|
2018-02-09 13:52:46 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
|
* SSimpleQuery *
|
|
|
|
|
* Classe per esecuzioni di query temporanee (wrapper semplice per SACommand) *
|
2018-02-09 15:38:29 +00:00
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
2018-07-06 16:30:37 +02:00
|
|
|
|
const TDate SSimple_query::sq_get_date(const char * field)
|
2018-02-09 15:38:29 +00:00
|
|
|
|
{
|
2018-03-14 14:45:46 +00:00
|
|
|
|
const TDate app(_rec.get_date(field));
|
|
|
|
|
return app;
|
2019-02-11 15:01:27 +01:00
|
|
|
|
}
|
|
|
|
|
|
2019-02-27 16:58:16 +01:00
|
|
|
|
const real SSimple_query::sq_get_real(const char * field)
|
|
|
|
|
{
|
|
|
|
|
const real app(_rec.get(field));
|
|
|
|
|
return app;
|
|
|
|
|
}
|
|
|
|
|
|
2019-02-11 15:01:27 +01:00
|
|
|
|
TString SSimple_query::sq_get(const char* field, bool rtrim)
|
|
|
|
|
{
|
|
|
|
|
TString fld = _rec.get(field);
|
|
|
|
|
if (rtrim)
|
|
|
|
|
fld.rtrim();
|
|
|
|
|
|
|
|
|
|
return fld;
|
|
|
|
|
}
|
|
|
|
|
|
2019-02-27 16:58:16 +01:00
|
|
|
|
TString SSimple_query::sq_get(const string& field, const bool rtrim)
|
2019-02-11 15:01:27 +01:00
|
|
|
|
{
|
|
|
|
|
return sq_get(field.c_str(), rtrim);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TString SSimple_query::sq_get(TString& field, bool rtrim)
|
|
|
|
|
{
|
|
|
|
|
return sq_get(static_cast<const char*>(field), rtrim);
|
|
|
|
|
}
|
2019-03-12 17:38:18 +01:00
|
|
|
|
|
2019-03-13 18:00:13 +01:00
|
|
|
|
TString SSimple_query::sq_get(unsigned int column, bool rtrim)
|
|
|
|
|
{
|
|
|
|
|
return _rec.get(column);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
unsigned SSimple_query::sq_get_num_fields() const
|
|
|
|
|
{
|
|
|
|
|
return _rec.get_num_fields();
|
|
|
|
|
}
|
|
|
|
|
|
2019-03-12 17:38:18 +01:00
|
|
|
|
void TDB_recordset::reset()
|
|
|
|
|
{
|
|
|
|
|
_items = 0;
|
|
|
|
|
_current_row = -1;
|
|
|
|
|
_columns_loaded = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* La query pu<70> iniziare con la stringa di connessione cos<6F> fatta:
|
|
|
|
|
* CONNECT(server, user, psw, driver = "MSSQL") il driver pu<EFBFBD> essere omesso
|
|
|
|
|
* Se c'<EFBFBD> la estraggo, setto la connessione e prendo la vera query
|
|
|
|
|
* Se no setto direttamente la query
|
|
|
|
|
*/
|
|
|
|
|
void TDB_recordset::set(const char* sql)
|
|
|
|
|
{
|
|
|
|
|
TString real_query = "";
|
|
|
|
|
|
|
|
|
|
// Guardo se la query inizia con la stringa di connessione
|
|
|
|
|
if(TString(sql).starts_with("CONNECT(", true))
|
|
|
|
|
{
|
|
|
|
|
TString query(sql);
|
|
|
|
|
int pos_EOCon = query.find(')'); // End Of Conn
|
2019-03-13 18:00:13 +01:00
|
|
|
|
const TString conn_str = query.sub(0, ++pos_EOCon);
|
2019-03-12 17:38:18 +01:00
|
|
|
|
set_connection(conn_str);
|
|
|
|
|
|
|
|
|
|
real_query << query.sub(pos_EOCon);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
real_query << sql;
|
|
|
|
|
|
|
|
|
|
if (!_freezed || _sql != sql)
|
|
|
|
|
reset();
|
|
|
|
|
_sql.cut(0) << real_query;
|
|
|
|
|
if (_sql.find("SELECT") >= 0 || _sql.find("select") >= 0)
|
|
|
|
|
find_and_reset_vars();
|
2019-03-12 18:04:44 +01:00
|
|
|
|
_rec->sq_set(_sql);
|
2019-03-12 17:38:18 +01:00
|
|
|
|
}
|
|
|
|
|
|
2019-03-13 18:00:13 +01:00
|
|
|
|
void TDB_recordset::set_connection(const char* conn_str) const
|
2019-03-12 17:38:18 +01:00
|
|
|
|
{
|
|
|
|
|
TString pn(conn_str);
|
|
|
|
|
TString srv = "", usr = "", pwd = "", drv = "";
|
|
|
|
|
|
|
|
|
|
int first_pos = pn.find("(", 0);
|
|
|
|
|
int last_pos = pn.find(",", first_pos);
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
for (i = 0; last_pos != -1; last_pos = pn.find(",", first_pos + 1), i++) {
|
|
|
|
|
switch (i)
|
|
|
|
|
{
|
|
|
|
|
case 0:
|
|
|
|
|
srv = pn.sub(first_pos + 1, last_pos);
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
usr = pn.sub(first_pos + 1, last_pos);
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
pwd = pn.sub(first_pos + 1, last_pos);
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
drv = pn.sub(first_pos + 1, last_pos);
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
first_pos = last_pos;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Guardo se ho valorizzato almeno i primi 3 elementi della connect
|
|
|
|
|
// Se non valorizzo l'ultimo metto come default MSSQL Server
|
|
|
|
|
if (i == 2)
|
|
|
|
|
connect(srv.ltrim(), usr.ltrim(), pwd.ltrim(), TSDB_MSSQL);
|
|
|
|
|
else if(i == 3)
|
|
|
|
|
connect(srv.ltrim(), usr.ltrim(), pwd.ltrim(), str_to_driver(drv.ltrim()));
|
|
|
|
|
}
|
|
|
|
|
|
2019-03-13 18:00:13 +01:00
|
|
|
|
int TDB_recordset::connect(const char * db, const char * user, const char * pass, const TT_driver tipo_db) const
|
2019-03-12 17:38:18 +01:00
|
|
|
|
{
|
2019-03-12 18:04:44 +01:00
|
|
|
|
return _rec->sq_connect(db, user, pass, tipo_db);
|
2019-03-12 17:38:18 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TT_driver TDB_recordset::str_to_driver(const char* tipo_db)
|
|
|
|
|
{
|
|
|
|
|
if (_stricmp(tipo_db, "") != 0)
|
|
|
|
|
return TSDB_undefined;
|
|
|
|
|
//! ODBC
|
|
|
|
|
if (_stricmp(tipo_db, "ODBC") == 0)
|
|
|
|
|
return TSDB_ODBC;
|
|
|
|
|
//! Oracle
|
|
|
|
|
if (_stricmp(tipo_db, "Oracle") == 0)
|
|
|
|
|
return TSDB_Oracle;
|
|
|
|
|
//! Microsoft SQL Server
|
|
|
|
|
if (_stricmp(tipo_db, "MSSQL") == 0)
|
|
|
|
|
return TSDB_MSSQL;
|
|
|
|
|
//! InterBase or Firebird
|
|
|
|
|
if (_stricmp(tipo_db, "InterBase") == 0)
|
|
|
|
|
return TSDB_InterBase;
|
|
|
|
|
//! SQLBase
|
|
|
|
|
if (_stricmp(tipo_db, "SQLBase") == 0)
|
|
|
|
|
return TSDB_SQLBase;
|
|
|
|
|
//! IBM DB2
|
|
|
|
|
if (_stricmp(tipo_db, "DB2") == 0)
|
|
|
|
|
return TSDB_DB2;
|
|
|
|
|
//! Informix
|
|
|
|
|
if (_stricmp(tipo_db, "Informix") == 0)
|
|
|
|
|
return TSDB_Informix;
|
|
|
|
|
//! Sybase ASE
|
|
|
|
|
if (_stricmp(tipo_db, "Sybase") == 0)
|
|
|
|
|
return TSDB_Sybase;
|
|
|
|
|
//! MySQL
|
|
|
|
|
if (_stricmp(tipo_db, "MySQL") == 0)
|
|
|
|
|
return TSDB_MySQL;
|
|
|
|
|
//! PostgreSQL
|
|
|
|
|
if (_stricmp(tipo_db, "PostgreSQL") == 0)
|
|
|
|
|
return TSDB_PostgreSQL;
|
|
|
|
|
//! SQLite
|
|
|
|
|
if (_stricmp(tipo_db, "SQLite") == 0)
|
|
|
|
|
return TSDB_SQLite;
|
|
|
|
|
//! SQL Anywere
|
|
|
|
|
if (_stricmp(tipo_db, "SQLAnywhere") == 0)
|
|
|
|
|
return TSDB_SQLAnywhere;
|
|
|
|
|
return TSDB_undefined;
|
|
|
|
|
}
|
|
|
|
|
|
2019-03-12 18:04:44 +01:00
|
|
|
|
int TDB_recordset::connect(const char* db, const char* user, const char* pass, const char* tipo_db) const
|
2019-03-12 17:38:18 +01:00
|
|
|
|
{
|
2019-03-12 18:04:44 +01:00
|
|
|
|
return _rec->sq_connect(db, user, pass, str_to_driver(tipo_db));
|
2019-03-12 17:38:18 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TRecnotype TDB_recordset::items() const
|
|
|
|
|
{
|
2019-03-12 18:04:44 +01:00
|
|
|
|
if(!_rec->sq_is_loaded() && _items == 0)
|
|
|
|
|
_rec->sq_exec();
|
2019-03-13 18:00:13 +01:00
|
|
|
|
auto& i = const_cast<TRecnotype&>(_items);
|
|
|
|
|
i = _rec->sq_items();
|
|
|
|
|
return i;
|
2019-03-12 18:04:44 +01:00
|
|
|
|
|
2019-03-12 17:38:18 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool TDB_recordset::move_to(TRecnotype pos)
|
|
|
|
|
{
|
2019-03-13 18:00:13 +01:00
|
|
|
|
const TRecnotype tot = items();
|
|
|
|
|
_current_row = pos;
|
|
|
|
|
|
|
|
|
|
if (_freezed && _loaded)
|
|
|
|
|
{
|
|
|
|
|
if (pos < 0)
|
|
|
|
|
_current_row = 0;
|
|
|
|
|
if (pos > tot)
|
|
|
|
|
_current_row = tot;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2019-03-12 18:04:44 +01:00
|
|
|
|
return _rec->sq_go(pos);
|
2019-03-12 17:38:18 +01:00
|
|
|
|
}
|
|
|
|
|
|
2019-03-13 18:00:13 +01:00
|
|
|
|
const TArray* TDB_recordset::row(TRecnotype n)
|
|
|
|
|
{
|
|
|
|
|
static TRecnotype last_n = -1;
|
|
|
|
|
|
|
|
|
|
if(n >= 0 && n < _rec->sq_items())
|
|
|
|
|
{
|
|
|
|
|
if (n == last_n && !_row.empty()) // Richiedo sempre la stessa riga
|
|
|
|
|
return &_row;
|
|
|
|
|
if (move_to(n))
|
|
|
|
|
{
|
|
|
|
|
const unsigned ncol = _rec->sq_get_num_fields();
|
|
|
|
|
last_n = n;
|
|
|
|
|
|
|
|
|
|
for (unsigned i = 0; i < ncol; i++)
|
|
|
|
|
_row.add(_rec->sq_get(i, false));
|
|
|
|
|
return &_row;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_row.destroy();
|
|
|
|
|
return &_row;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TDB_recordset::requery()
|
|
|
|
|
{
|
|
|
|
|
_items = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
unsigned TDB_recordset::columns() const
|
|
|
|
|
{
|
|
|
|
|
return _rec->sq_get_num_fields();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const TVariant& TDB_recordset::get(unsigned int column) const
|
|
|
|
|
{
|
|
|
|
|
static TVariant field = NULL_VARIANT;
|
|
|
|
|
static unsigned int last_get = 0;
|
|
|
|
|
if(column != last_get || field == NULL_VARIANT)
|
|
|
|
|
{
|
|
|
|
|
last_get = column;
|
|
|
|
|
field = _rec->sq_get(column);
|
|
|
|
|
return field;
|
|
|
|
|
}
|
|
|
|
|
return field;
|
|
|
|
|
}
|
|
|
|
|
|
2019-03-12 18:04:44 +01:00
|
|
|
|
TDB_recordset::TDB_recordset(const char* sql, const bool freezed) : _freezed(freezed), _loaded(false)
|
2019-03-12 17:38:18 +01:00
|
|
|
|
{
|
2019-03-12 18:04:44 +01:00
|
|
|
|
set(sql);
|
2019-03-13 18:00:13 +01:00
|
|
|
|
_current_row = -1;
|
2019-03-12 18:04:44 +01:00
|
|
|
|
_rec = new SSimple_query();
|
2019-03-12 17:38:18 +01:00
|
|
|
|
_items = 0;
|
|
|
|
|
set(sql);
|
|
|
|
|
}
|